方法一、p[j+1]=='*',此时从s[i]开始的子串,假设是s[i],s[i+1].....s[i+k]都等于p[j],则意味着这些都可能是合适的匹配,这就得递归剩下的(i,j+2),(i+1,j+2).......(i+k,j+2)
实现代码:
bool isMatch(string s, string p) {
return check(s,p,0,0);
}
bool check(string s,string p,int Slen,int Plen)
{
if(Plen==p.length())
return Slen==s.length();
if(p[Plen+1]=='*')
{
while(Slen<s.length()&&(s[Slen]==p[Plen]||p[Plen]=='.'))
{
if(check(s,p,Slen,Plen+2))
return true;
Slen++;
}
return check(s,p,Slen,Plen+2);
}
else{
if(Slen<s.length()&&(s[Slen]==p[Plen]||p[Plen]=='.'))
{
return check(s,p,Slen+1,Plen+1);
}
else
return false;
}
}
方法二、不断地匹配,在p[1]=='*'时,匹配并且递归(i+1,p),如果递归结果不成功,则计算(i,j+2)
bool isMatch(string s, string p) {
if(p.empty())
return s.empty();
if(p[1]=='*')
return (isMatch(s,p.substr(2))||((!s.empty())&&(s[0]==p[0]||p[0]=='.')&&isMatch(s.substr(1),p)));
else
return ((!s.empty()) && (s[0]==p[0]||p[0]=='.') && isMatch(s.substr(1),p.substr(1)));
}