可能存在一个现象,就是aaab,然后a*ab,那么这样*只能代表一个a。
这道题可以使用动态规划的方式来解决。
这道题就是状态的判断:是否两个都为0?只有两个都为0才为true,并且判断*,有两个情况:为*或者不为*,不为*直接前移判断比较,否则就两种情况,忽略或者比较二选其一,只要两个或有一个成立即可!
class Solution {
public boolean isMatch(String s, String p) {
int m = s.length(), n = p.length();
boolean[][] f = new boolean[m+1][n+1];//得加1!
//长度未必相同,所以可能是j-2/i-1后相同
for(int i = 0; i <= m; i++){//要有等于!因为f是m+1,n+1!
for(int j = 0; j <= n; j++){
if(j == 0)
f[i][j] = i == 0;//B为0但A不为0
else{
if(p.charAt(j-1) != '*'){//不等于*就是直接比较
// if(j>1 && p.charAt(j-2))
if(i >= 1 && (p.charAt(j-1) == s.charAt(i-1)
|| p.charAt(j-1) == '.' ))
f[i][j] = f[i-1][j-1];//第一次算
}
else{//等于,那么前移
if(j >= 2){//直接忽略,不等于,那么就忽略
f[i][j] |= f[i][j-2];//第二次算,不看
}
if(j >= 2 && i >= 1 &&
(s.charAt(i-1) == p.charAt(j-2) || p.charAt(j-2) == '.'))
//p不动s前移一位,就是看的情况
f[i][j] |= f[i-1][j];
}
}
}
}
return f[m][n];
}
}