https://leetcode.com/problems/wildcard-matching/description/
hard题 ,
很明显可以用dp来做,(可以缩小成小一号的问题)
难点在于有* 又有?号
对于这种问题,我们一般就分情况讨论就好了,不必紧张。
如果没有*? 则比较最后两个字符
如果最后一个是?, 则等于各减去一个字符的结果。
如果最后一个是 *, 则这个 *可以表示0 到多个,这里 trick在于取 0个不留*号,或者取一个然后保留 *号。
这道题和Regular expression matching很像,做完这道可以看下那一道
public boolean isMatch(String s, String p) {
boolean[][] dp = new boolean[s.length() + 1][p.length() + 1];
for (int i = 0; i <= s.length(); i++) {
for (int j = 0; j <= p.length(); j++) {
if (i == 0 && j == 0) {
dp[i][j] = true;
} else if ( i != 0 && j == 0) {
continue; // default to false;
} else {
if ("*?".indexOf(p.charAt(j - 1)) < 0) {
if (i == 0 || p.charAt(j - 1) != s.charAt(i - 1) ) {
; // default to false;
} else {
dp[i][j] = dp[i - 1][j - 1];
}
} else if (p.charAt(j - 1) == '?') {
if (i != 0) dp[i][j] = dp[i - 1][j - 1];
} else if (p.charAt(j - 1) == '*') { // * 取0个,*取一个
dp[i][j] = dp[i][j - 1];// * 取0个,
if (i != 0) dp[i][j] |= dp[i - 1][j]; //*取一个
}
}
}
}
return dp[s.length()][p.length()];
}