题意
正则表达式匹配,可用的元字符为.和*。问p所代表的的正则表达式能否匹配s。
思路
分情况讨论清楚转移就好了。
状态表示:d[i,j],s匹配到i,p匹配到j,是否能匹配成功。
转移方程:
- pj为alpha:
- si=pj:d[i,j]=d[i−1,j−1]
- si≠pj:d[i,j]=0
- pj=∗:
- si=pj−1或pj−1=. : d[i,j]=d[i,j−2]||d[i−1,j] (分别代表:pj−1∗匹配空字符,匹配si,匹配至少1个。
- si≠pj−1且pj−1≠. : d[i,j]=d[i,j−2](即si不能匹配当前的x*,那么我们直接认为x*为空字符)。
- pj=.:
- d[i,j]=d[i−1,j−1]
代码
const int maxn = 1005;
int d[maxn][maxn];
class Solution {
public:
string s, p;
int dfs(int i, int j) {
if (i < 0 || j < 0) {
if (i < 0 && j < 0) return 1;
if (p[j] == '*') return dfs(i, j - 2);
return 0;
}
if (d[i][j] != -1) return d[i][j];
int ans = 0;
if (p[j] != '.' && p[j] != '*') {
if (s[i] == p[j]) ans = dfs(i - 1, j - 1);
else ans = 0;
} else {
if (p[j] == '.') {
ans = dfs(i - 1, j - 1);
} else {
//p[j] == '*'
if (j > 0) {
if (s[i] == p[j - 1] || p[j - 1] == '.')
ans = dfs(i - 1, j) || (j >= 2 ? dfs(i, j - 2) : 0);
else
ans = j >= 2 ? dfs(i, j - 2) : 0;
} else {
ans = 0;
}
}
}
return d[i][j] = ans;
}
bool isMatch(string ss, string pp) {
s = ss; p = pp;
int m = s.length(), n = p.length();
memset(d, -1, sizeof(d));
return dfs(m - 1, n - 1);
}
};