方法1: recursion + memo。
class Solution {
Map<Pair<Integer, Integer>, Boolean> map = new HashMap<>();
public boolean isMatch(String s, String p) {
return dfs(s, p, 0, 0);
}
public boolean dfs(String s, String p, int sStart, int pStart){
Pair<Integer, Integer> pair = new Pair<>(sStart, pStart);
if(map.containsKey(pair)) return map.get(pair);
if(sStart == s.length()){
for(int i = pStart; i < p.length(); i++){
if(p.charAt(i) != '*') {
map.put(pair, false);
return false;
}
}
map.put(pair, true);
return true;
}
if(pStart == p.length() - 1 && p.charAt(pStart) == '*') {
map.put(pair, true);
return true;
}
if(sStart == s.length() && pStart == p.length()){
map.put(pair, true);
return true;
}
if(sStart == s.length() || pStart == p.length()){
map.put(pair, false);
return false;
}
char c = p.charAt(pStart);
if(c == '?'){
return dfs(s, p, sStart + 1, pStart + 1);
}else if(c == '*'){
for(int i = sStart; i < s.length(); i++){
if(dfs(s, p, i, pStart + 1)) {
map.put(pair, true);
return true;
}
}
}else{
if(c != s.charAt(sStart)) {
map.put(pair, false);
return false;
}
return dfs(s, p, sStart + 1, pStart + 1);
}
map.put(pair, false);
return false;
}
}
方法2: dp。具体分析请直接看lc官方解答2.
class Solution {
public boolean isMatch(String s, String p) {
int sLen = s.length();
int pLen = p.length();
if(p.equals(s) || p.equals("*")) return true;
if(p.isEmpty() && s.isEmpty()) return false;
// initalize array dp all false
boolean[][] dp = new boolean[pLen + 1][sLen + 1];
dp[0][0] = true;
for(int i = 1; i <= pLen; i++){
if(p.charAt(i - 1) == '*'){
int j = 1;
while((!dp[i - 1][j - 1]) && j <= sLen) j++;
dp[i][j - 1] = dp[i - 1][j - 1];
while(j <= sLen) dp[i][j++] = true;
}
else if(p.charAt(i - 1) == '?'){
for(int j = 1; j <= sLen; j++){
dp[i][j] = dp[i - 1][j - 1];
}
}
else{
for(int j = 1; j <= sLen; j++){
dp[i][j] = dp[i - 1][j - 1] && (p.charAt(i - 1) == s.charAt(j - 1));
}
}
}
return dp[pLen][sLen];
}
}
总结:
- 无