//*是匹配前面的元素a*,只能匹配a
class Solution {
public:
bool isMatch(string s, string p) {
int m = s.size();
int n = p.size();
auto matches = [&](int i, int j) {
//s为空
if (i == 0) {
return false;
}
//p[j-1]==s[i]
if (p[j - 1] == '.') {
return true;
}
//判断是否相同
return s[i - 1] == p[j - 1];
};
vector<vector<int>> f(m + 1, vector<int>(n + 1));
f[0][0] = true;
for (int i = 0; i <= m; ++i) {
for (int j = 1; j <= n; ++j) {
if (p[j - 1] == '*') {
//a|=b,实际上就是a=a|b,是一个位或运算,是二进制运算,在同一位上数字相同时结果为0,不同时为1。
//'b*' 等的当成整体看待
//注意到当 'b*' 匹配完 'b' 之后,选择让 'b*' 不再进行匹配,把 'b*' 丢弃。转化为子问题 f[i][j-2]:
f[i][j] |= f[i][j - 2];
//注意到当 'b*' 匹配完 'b' 之后,它仍然可以继续发挥作用。因此可以只把 i 前移一位,而不丢弃 'b*', 转化为子问题 f[i-1][j]:
if (matches(i, j - 1)) {
f[i][j] |= f[i - 1][j];
}
}
else {
if (matches(i, j)) {
f[i][j] |= f[i - 1][j - 1];
}
}
}
}
return f[m][n];
}
};
10. 正则表达式匹配
最新推荐文章于 2022-10-01 16:30:18 发布