解法一:recursion
class Solution {
public:
bool isMatch(string s, string p) {
if(s.empty()){
if(p.empty()) return true;
if(p.size()>=1 && p[1]=='*') return isMatch(s, p.substr(2));
return false;
}else if(p.empty()) return false;
if(p.size()>1 && p[1]=='*'){
if(p[0]==s[0]|| p[0]=='.') return isMatch(s.substr(1), p)||isMatch(s, p.substr(2));
else return isMatch(s, p.substr(2));
}
if(s[0]==p[0] || p[0]=='.') return isMatch(s.substr(1), p.substr(1));
else return false;
}
};
解法二:DP
class Solution {
public:
bool isMatch(string s, string p) {
int m = s.size();
int n = p.size();
vector<vector<bool>> dp(m+1, vector<bool>(n+1, false));
dp[0][0] = true;
for(int i=0;i<=m;i++){
for(int j=1;j<=n;j++){
if(j>1 && p[j-1]=='*'){
dp[i][j] = dp[i][j-2] || (i>0 && (s[i-1]==p[j-2] || p[j-2]=='.') && dp[i-1][j]);
}else{
dp[i][j] = i>0 && dp[i-1][j-1] && (s[i-1]==p[j-1]||p[j-1]=='.');
}
}
}
return dp[m][n];
}
};
i - number of s string element
j - number of p string element
Condition 1: p current is "*"
p previous and p current --> nothing ("a*"->"") dp[i][j] = dp[i][j-2]
p previous --> s current ("a*"->"a" || ".*"->"a") dp[i][j] = dp[i-1][j] && (s[i-1]==p[j-2] || p[j-2]=='.')
not dp[i-1][j-2] 因为前面也许有elements map to “a*”; if not, nothing can also be mapped to "a*"
Condition 2: p current is not "*"
p current --> s current ("a"->"a" || "."->"a") dp[i][j] = dp[i-1][j-1] && (s[i-1]==p[j-1] || p[j-1]=='.')