1. 只要求匹配带'.'和'*'
2. '.‘可以当作任何字符来匹配
3. 只有'*'需要特殊处理,'*'可以匹配0个或者多个前面的字符。 注意处理好边界情况。
class Solution {
public:
bool isMatch(string s, string p) {
int ans = 0;
int n = s.size();
int m = p.size();
vector<vector<int>> visit(n+1, vector<int>(m+1));
isMatch(s, p, 0, 0, visit, ans);
return ans;
}
void isMatch(const string& s, const string& p, int u, int v, vector<vector<int>>& visit, int& ans) {
if (visit[u][v]) return;
visit[u][v] = 1;
if (ans) return;
if (u == s.size() && v == p.size()) {
ans = 1;
return;
}
if (p[v] == '*') {
isMatch(s, p, u, v+1, visit, ans);
return;
}
if (v+1 < p.size() && p[v+1] == '*') {
// zero match
isMatch(s, p, u, v+1, visit, ans);
}
if (u == s.size() || v == p.size()) return;
if (p[v] == '.' || p[v] == s[u]) {
isMatch(s, p, u+1, v+1, visit, ans);
if (v+1 < p.size() && p[v+1] == '*') {
isMatch(s, p, u+1, v, visit, ans);
}
}
}
};