题目描述
题解1(动态规划)
//状态转移式:
// dp[i][j] = dp[i-1][j-1] ----正常匹配时
// dp[i][j] = dp[i][j-1] ----当p[j] == '*',匹配问题就和p中j前的字符有关了
// dp[i][j] = dp[i-1][j] ----当p[j-1] == '*' && s[i] == p[j-1],即一旦此时s中第i个字符与p中*前的字符相同,则问题就和s中前i-1个字符有关了
class Solution {
public:
bool isMatch(string s, string p) {
int s_len = s.size();
int p_len = p.size();
vector<vector<int>> dp(s_len+1, vector<int>(p_len+1, 0));
dp[0][0] = true;
auto SPmatches = [&](int i, int j) {
if (i == 0) {
return false;
}
if (p[j - 1] == '.') {
return true;
}
return s[i - 1] == p[j - 1];
};
for(int i = 0; i <= s_len; i++){
for(int j = 1; j <= p_len; j++){
if (p[j - 1] == '*') {
//赋值顺序可以帮助优化
dp[i][j] = dp[i][j - 2];
if (SPmatches(i, j - 1)) {
dp[i][j] |= dp[i - 1][j];
}
}
else {
if (SPmatches(i, j)) {
dp[i][j] = dp[i - 1][j - 1];
}
}
}
}
return dp[s_len][p_len];
}
};
感觉还是不太会解DP问题,嘤嘤嘤