10 正则表达式匹配
原题链接:正则表达式匹配
个人解法
这题不会写。。直接用c++的正则库,结果TLE了
代码:
class Solution {
public:
bool isMatch(string s, string p) {
return regex_match(s,regex(p));
}
};
更好的解法
思路:
动态规划:
状态表示:f[i][j]
表示s串前i个字符和p串前j个字符是否匹配
状态转移:具体题解
时间复杂度: O ( n m ) O(nm) O(nm)
代码:
class Solution {
public:
bool isMatch(string s, string p) {
int n = s.size();
int m = p.size();
auto match = [&](int i, int j) {
if(i == 0) return false;
if(p[j - 1] == '.') return true;
return s[i - 1] == p[j - 1];
};
vector<vector<int>> f(n + 1, vector<int> (m + 1));
f[0][0] = true;
for(int i = 0;i <= n;i ++) {
for(int j = 1;j <= m;j ++) {
if(p[j - 1] != '*') {
if(match(i, j))
f[i][j] |= f[i - 1][j - 1];
}else {
f[i][j] |= f[i][j - 2];
if(match(i,j - 1))
f[i][j] |= f[i - 1][j];
}
}
}
return f[n][m];
}
};