第一种方法:迭代回溯
两个指针,一个维持pattern的位置,一个维持str的位置,每一次循环str的idx或者pattern的idx至少有一个会往后移动一步。
当strIdx < srtLen的时候,因为存在这个pattern所以要进行尝试,加入匹配0个、1个、2个..试试看能不能匹配到最后,方法是记录上次遇到*的时候的PatternIdx和strIdx,如果后面没有匹配上,那么strIdx就从下一个开始匹配,patternIdx不变。
最后结束了以后,因为到这里的时候str一定已经结束了pattern可能有剩下的,所以还要排除掉‘ ’,最后看pattern的指针是否指到最后。
class Solution {
public:
bool isMatch(string s, string p)
{
int s1=0,
p1=0,
sLen=s.size(),
pLen=p.size(),
lastPatternIdx=-1,
lastStrIdx=-1;
while(s1<sLen)
{
if(p1<pLen && (s[s1]==p[p1] || p[p1]=='?'))
{
p1++;
s1++;
}
else if(p1<pLen && p[p1]=='*')
{
lastPatternIdx=p1;
lastStrIdx=s1;
p1++;
}
else if(lastPatternIdx>-1)
{
p1=lastPatternIdx+1;
s1=++lastStrIdx;
}
else
return false;
}
while(p[p1]=='*')
p1++;
return p[p1]=='\0';
}
};
第二种方法:动态规划
class Solution {
public:
bool isMatch(string s, string p)
{
int m=s.size();
int n=p.size();
vector<vector<bool> >match(m+1,vector<bool>(n+1,false));
match[0][0]=true;
int i,j;
for(j=1;j<=n;j++)
{
if(p[j-1]=='*'&&match[0][j-1])
match[0][j]=true;
}
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
{
if(p[j-1]!='*')
{
if(match[i-1][j-1]&&(p[j-1]=='?'||s[i-1]==p[j-1]))
match[i][j]=true;
//else
// match[i][j]=false;
}
else//关键步骤
{
if(match[i-1][j]||match[i][j-1])
match[i][j]=true;
}
}
return match[m][n];
}
};