思路:
方法一:递归。TLE。
class Solution {
private:
bool match(string s, string p, int i, int j) {
if(p[j] == '*') {
while(p[j] == '*') {
j++;
}
if(p[j] == '\0') return true;
while(s[i] != '\0' && !match(s, p, i, j)) {
i++;
}
return s[i] != '\0';
}else if(s[i] == '\0' || p[j] == '\0') {
return s[i] == p[j];
}else if(s[i] == p[j] || p[j] == '?') {
return match(s, p, ++i, ++j);
}else {
return false;
}
}
public:
bool isMatch(string s, string p) {
bool flag = match(s, p, 0, 0);
return flag;
}
};
方法二:迭代。时间复杂度O(),空间复杂度O(1)。
class Solution {
public:
bool isMatch(string s, string p) {
int n = s.size(), m = p.size();
int is = 0, ip = 0, iis = 0, iip = m;
while(is < n) {
if(ip < m && (s[is] == p[ip] || p[ip] == '?') ) {
++is;
++ip;
continue;
}else if(ip < m && p[ip] == '*') {
iis = is;
iip = ip;
++ip;
continue;
}else if(iip < m) {
is = ++iis;
ip = iip + 1;
continue;
}
return false;
}
while(ip < m && p[ip] == '*') {
++ip;
}
return ip == m;
}
};