public class Solution {
private int[][] dp;
public boolean isMatch(String s, String p) {
if (s == null || p == null) {
return false;
}
dp = new int[s.length()][p.length()];
return isMatchHelper(s, 0, p, 0);
}
private boolean isMatchHelper(String s, int indexS, String p, int indexP) {
if (indexP >= p.length() || indexS >= s.length()) {
return (indexP >= p.length() && indexS >= s.length());
}
if (dp[indexS][indexP] == -1) {
return false;
} else if (dp[indexS][indexP] == 1) {
return true;
}
char cp = p.charAt(indexP);
boolean res = false;
if (cp == '?') {
// Match '?'
res = isMatchHelper(s, indexS + 1, p, indexP + 1);
} else if (cp == '*') {
// Match '*'
for (int i = indexS; i <= s.length(); i++) {
boolean cur = isMatchHelper(s, i, p, indexP + 1);
if (cur == true) {
res = true;
break;
}
}
} else {
// Match regular char
if (cp == s.charAt(indexS)) {
res = isMatchHelper(s, indexS + 1, p, indexP + 1);
}
}
if (res == true) {
dp[indexS][indexP] = 1;
} else {
dp[indexS][indexP] = -1;
}
return res;
}
}
在 recursion 的基础上加了 二维 DP 数组来储存之前的计算结果。
不过 leetcode 最后一个大集合还是过不去。