剑指offer 052、正则表达式匹配
题目
题解
还是不太懂
力扣大佬三叶姐的方法
class Solution {
public:
bool match(string s, string p) {
// 技巧,往原字符头部插入空格,这样得到的string数组是从1开始
int m = s.size(), n = p.size();
s.insert(s.begin(), ' ');
p.insert(p.begin(), ' ');
// f(i, j)代表s中的1~i字符和p中的1~j字符是否匹配
vector<vector<bool>> f(m + 1, vector<bool>(n + 1, false));
f[0][0] = true;
for (int i = 0; i <= m; ++i) {
for (int j = 1; j <= n; ++j) {
// 如果下一个字符是 '*',则代表当前字符不能被单独使用
if (j + 1 <= n && p[j + 1] == '*') continue;
// 对应了p[j] 为普通字符和 '.' 的两种情况
if (i - 1 >= 0 && p[j] != '*') {
f[i][j] = f[i - 1][j - 1] && (s[i] == p[j] || p[j] == '.');
}
// 对应了p[j] 为 '*' 的情况
else if (p[j] == '*') {
f[i][j] = (j - 2 >= 0 && f[i][j - 2])
|| (i - 1 >= 0 && f[i - 1][j] && (s[i] == p[j - 1] || p[j - 1] == '.'));
}
}
}
return f[m][n];
}
};