递归(Time Limited),便于理解
class Solution {
public:
bool isMatch(string s, string p) {
if (p.empty()) return s.empty();//同空为真
if (p[0]!='*'){
if (s[0]==p[0]||(p[0]=='?'&&!s.empty())) return isMatch(s.substr(1),p.substr(1));
else return false;
}
else{
if (isMatch(s,p.substr(1))) return true;
if (!s.empty()) return isMatch(s.substr(1),p);
else return false;
}
}
};
非递归
(借鉴solution置顶算法)
class Solution {
public:
bool isMatch(string s, string p) {//通配符匹配
int m=s.size(),n=p.size(),index=-1,ss=0,i=0,j=0;
bool flag=false;
if (p.empty()) return s.empty();
vector<vector<bool>> f(m+1,vector<bool>(n+1,false));
f[0][0]=true;
for (i=0,j=0;i<m;){
//cout<<i<<" "<<j<<" "<<index<<endl;
switch(p[j]){
case '?':
i++;j++;
break;
case '*'://记录下此时*的位置,便于回溯(index)
ss=i;//目标串此时位置
while(p[j]=='*'&&j<n) j++;
index=j-1;
break;
default:
//cout<<p[j]<<" ";
if (s[i]!=p[j]){
if (index==-1) return false;
j=index+1;
ss++;
i=ss;
}
else {
i++;j++;
}
break;
}
}
//cout<<j<<endl;
while(p[j]=='*'&&j<n) j++;
//cout<<j;
return j==n;
}
};