在正则表达式匹配的过程中,如果当前字符匹配(s[i] == p[j]||p[j] == '.'),且p[j+1] == "*";则可以继续匹配零次或多次,否则只匹配一次;若当前字符不匹配,但p[j+1]=="*",可以匹配一次,否则return false;
class Solution {
public:
unordered_map<string,bool>memo;
bool dp(string& s,int i,string& p,int j){
int m = s.size();int n = p.size();
if(j == n)return i == m;
if(i == m){
if((n-j)%2 == 1){
return false;
}
for(;j<n;j+=2){
if(p[j+1]!='*'){
return false;
}
}
return true;
}
string key = to_string(i) + ";" + to_string(j);
if(memo.count(key))return memo[key];
int res = false;
if(s[i] == p[j]||p[j] == '.'){
if(j<p.size()-1&&p[j+1]=='*'){
res = dp(s,i,p,j+2)||dp(s,i+1,p,j);
}else{
res = dp(s,i+1,p,j+1);
}
}else{
if(j<p.size()-1&&p[j+1]=='*'){
res = dp(s,i,p,j+2);
}else{
res = false;
}
}
memo[key] = res;
return res;
}
bool isMatch(string s, string p) {
return dp(s,0,p,0);
}
};