![]()
class Solution {
public:
bool isMatch(string s, string p) {
int m=s.size()+1;int n=p.size()+1;
vector<vector<bool>> dp(m,vector<bool>(n,false));
dp[0][0]=true;//空串匹配
for(int j=2;j<n;j+=2){//正则偶数位为*可以匹配空串
if(p[j-1]=='*' && dp[0][j-2]) dp[0][j]=true;
}
for(int i=1;i<m;i++){
for(int j=1;j<n;j++){
if(p[j-1]=='*'){
if(dp[i][j-2]) dp[i][j]=true;//*前元素出现0次
else if(dp[i-1][j] && s[i-1]==p[j-2]) dp[i][j]=true;//*前元素多出现一次
else if(dp[i-1][j] && p[j-2]=='.') dp[i][j]=true;//*前元素是.
}
else{
if(dp[i-1][j-1] && s[i-1]==p[j-1]) dp[i][j]=true;//该位字符相等,正常匹配
else if(dp[i-1][j-1] && p[j-1]=='.') dp[i][j]=true;//.万能匹配
}
}
}
return dp[m-1][n-1];
}
};