难度:hard
题目:
AC解:
class Solution {
public:
bool isMatch(string s, string p) {
int slen = s.length();
int plen = p.length();
if (slen == 0 && plen == 0)
return true;
vector<vector<bool>> dp(slen + 1, vector<bool>(plen + 1, false));
//初始化数组
dp[0][0] = true;
//p为a*a*...此种情况
for (int i = 2; i <= plen; i += 2) {
if (dp[0][i - 2] && p[i - 1] == '*')
dp[0][i] = true;
}
for (int i = 1; i < slen + 1; i++)
for (int j = 1; j < plen + 1; j++) {
if (s[i - 1] == p[j - 1] || p[j - 1] == '.')
dp[i][j] = dp[i - 1][j - 1];
if (p[j - 1] == '*') {
if (s[i - 1] == p[j - 2] || p[j - 2] == '.')
//分别为重复0, 1,多次
dp[i][j] = dp[i][j - 2] || dp[i][j - 1] || dp[i - 1][j];
else
dp[i][j] = dp[i][j - 2]; //s[i - 1] 和 p[j - 2]不相等,重复0次
}
}
return dp[slen][plen];
}
};