方法一:动态规划
class Solution {
public:
bool isMatch(string s, string p) {
int m = s.size();
int n = p.size();
//dp[i][j]表示s的前i个字符和p的前j个字符能否匹配
bool dp[m+1][n+1]={false};
//初始化
dp[0][0] = true;
for(int i = 1; i <= n; i++)
dp[0][i] = p[i-1]=='*' && dp[0][i-2];
//转移方程
for(int i = 1; i <= m; i++)
for(int j = 1; j <= n; j++){
if(s[i-1] == p[j-1] || p[j-1] == '.')
dp[i][j] = dp[i-1][j-1];
if(p[j-1] == '*'){
if(p[j - 2] == s[i - 1] || p[j - 2] == '.')
dp[i][j] = dp[i - 1][j] || dp[i][j - 2];
else
dp[i][j] = dp[i][j - 2];
}
}
return dp[m][n]; //结果
}
};