题解
- 定义
- 初值
- 只需要注意
的判断
- 不匹配的时候
,把
和
之前的字符拿掉,看是否匹配
- 匹配的时候,由于可能匹配很多个,然而我们不需要确定到底匹配了几次,只需要判断
,也就是当前
最末尾已经知道能和
匹配了,那么删掉
- 还有,两层循环次序无所谓
AC-Code
class Solution {
public:
bool isMatch(string s, string p) {
int n = s.length();
int m = p.length();
auto matches = [&](int i, int j) {
if(i == 0) return false;
if(p[j - 1] == '.') return true;
return s[i - 1] == p[j - 1];
};
vector<vector<int>> dp(n + 1, vector<int>(m + 1));
dp[0][0] = true;
for(int j = 1; j <= m; ++j) {
for(int i = 0; i <= n; ++i) {
if(p[j - 1] == '*') {
dp[i][j] |= dp[i][j - 2]; // .* 不匹配
if(matches(i, j - 1)) { // 可以匹配(可能多次)
dp[i][j] |= dp[i - 1][j]; // 把当前s[i-1]删掉,看剩下的是否能匹配
}
}
else {
if(matches(i, j)) {
dp[i][j] |= dp[i - 1][j - 1];
}
}
}
}
return dp[n][m];
}
};