题目:https://leetcode-cn.com/problems/regular-expression-matching/
解题:
如果 p.charAt(j) == s.charAt(i) : dp[i][j] = dp[i-1][j-1];
如果 p.charAt(j) == '.' : dp[i][j] = dp[i-1][j-1];
如果 p.charAt(j) == '*':
如果 p.charAt(j-1) != s.charAt(i) : dp[i][j] = dp[i][j-2] //in this case, a* only counts as empty
如果 p.charAt(j-1) == s.charAt(i) or p.charAt(j-1) == '.':
dp[i][j] = dp[i-1][j] //in this case, a* counts as multiple a
or dp[i][j] = dp[i][j-1] // in this case, a* counts as single a
or dp[i][j] = dp[i][j-2] // in this case, a* counts as empty
答案:(动态规划)
public boolean isMatch(String s, String p) {
int m = s.length();
int n = p.length();
boolean[][] status = new boolean[m+1][n+1];
status[0][0] = true;
for(int i=0;i<=m;i++){
for(int j=1;j<=n;j++){
if(p.charAt(j-1) == '*'){
status[i][j] = status[i][j-2];
if(matches(s,p,i,j-1)){
status[i][j] = status[i][j] || status[i-1][j];
}
}else{
if (matches(s, p, i, j)) {
status[i][j] = status[i - 1][j - 1];
}
}
}
}
return status[m][n];
}
public boolean matches(String s, String p, int i, int j) {
if (i == 0) {
return false;
}
if (p.charAt(j - 1) == '.') {
return true;
}
return s.charAt(i - 1) == p.charAt(j - 1);
}