给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 ‘.’ 和 ‘*’ 的正则表达式匹配。
‘.’ 匹配任意单个字符
‘*’ 匹配零个或多个前面的那一个元素
所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。
说明:
s 可能为空,且只包含从 a-z 的小写字母。
p 可能为空,且只包含从 a-z 的小写字母,以及字符 . 和 *。
class Solution {
public:
bool isMatch(string s, string p) {
//dp 这题思路也挺6
//f的实际含义为第i和第j个char能否匹配
//即f00表示空串匹配 实际f的长度应该为size+1
int m = s.size(), n = p.size();
vector<vector<bool>> f(m + 1, vector<bool> (n + 1));
f[0][0] = true; //空串可以匹配
for(int i = 0; i <= m; ++i) {
for(int j = 1; j <= n; ++j) {
//为了避免循环中越界j从1开始 而且j=0也没用
if(p[j - 1] == '*') {
if(match(s, p, i, j - 1)) {
//s可以选择与*匹配 或不匹配
f[i][j] = f[i][j - 2] || f[i - 1][j];
}else{
f[i][j] = f[i][j - 2];
}
}else{
if(match(s, p, i, j)) {
f[i][j] = f[i - 1][j - 1]; //完全取决于前一个char
}else{
f[i][j] = false;
}
}
}
}
return f[m][n];
}
bool match(string& s, string& p, int i, int j) {
if(i == 0) {
return false;
}
if(p[j - 1] == '.')
return true;
return s[i - 1] == p[j - 1]; //第i 和jth
}
};
动态规划