分析
参考正则表达式匹配
递归写法:
public boolean isMatch(String s, String p) {
if(p.length() == 0) {
return s.length() == 0;
}
if(s.length() <= 0) {
boolean same = true;
for(int i = 0; i < p.length(); i++) {
if(p.charAt(i) != '*') {
same = false;
break;
}
}
return p.length() <= 0 || same;
}
//System.out.println("执行");
if(p.length() > 0 && p.charAt(0) != '*') {
return (s.charAt(0) == p.charAt(0) || p.charAt(0) == '?') && isMatch(s.substring(1),p.substring(1));
} else {//*参与匹配和不参与匹配两种情况
return isMatch(s,p.substring(1)) || isMatch(s.substring(1),p);
}
}
动态规划写法:
public boolean isMatch(String s, String p) {
boolean[][] dp = new boolean[s.length() + 1][p.length() + 1];
dp[0][0] = true;
for(int i = 1; i < p.length() + 1; i++) {
dp[0][i] = dp[0][i-1] && p.charAt(i-1) == '*';
}
for(int i = 1; i < s.length() + 1 ;i++) {
for(int j = 1; j < p.length() + 1; j++) {
if(p.charAt(j-1) == '*') {
boolean exist = false;
for(int m = 0; m < i; m++){
if(dp[m][j-1] == true) {
exist = true;
break;
}
}
dp[i][j] = dp[i][j-1] || exist;
} else {
dp[i][j] = dp[i-1][j-1] && (s.charAt(i-1) == p.charAt(j-1) || p.charAt(j-1) == '?');
}
}
}
return dp[s.length()][p.length()];
}