请实现一个函数用来匹配包括’.’和’‘的正则表达式。
模式中的字符’.’表示任意一个字符,而’‘表示它前面的字符可以出现任意次(含0次)。
在本题中,匹配是指字符串的所有字符匹配整个模式。
例如,字符串”aaa”与模式”a.a”和”abaca”匹配,但是与”aa.a”和”ab*a”均不匹配。
数据范围
样例
输入: s=”aa” p=”a*” 输出:true
class Solution {
public:
// f[i, j] 表示s[1, 2, ...i] 与 p[1, 2, ...j]匹配的方案集合
// 属性 集合是否为空
bool isMatch(string s, string p) {
int n = s.size(), m = p.size();
s = ' ' + s, p = ' ' + p;
vector<vector<bool>>f(n + 1, vector<bool>(m + 1));
f[0][0] = true;
// s可以为空串,p不能为空串
for (int i = 0; i <= n; ++i) {
for (int j = 1; j <= m; ++j) {
if (j + 1 < p.size() && p[j + 1] == '*') continue;
if (i && p[j] != '*') {
f[i][j] = f[i - 1][j - 1] && (s[i] == p[j] || p[j] == '.');
}
else if (p[j] == '*') {
f[i][j] = f[i][j - 2] || i && f[i - 1][j] && (s[i] == p[j - 1] || p[j - 1] == '.');
}
}
}
return f[n][m];
}
};