题意:通配符匹配,有两个通配符:
1、"?"匹配任意单个字母
2、"*"匹配任意字母串(包括空串)
思路:根据*切割成若干子串,只要从前到后能匹配即可,要注意头部、尾部和边界情况。分有没有*两种情况讨论。
代码:
bool isMatch(string s, string p)
{
if(p=="") return s=="";
string t,temp="";
int i,head=0,tail=0,j,k,start;
vector<string> ps;
bool tag=false,star=false;
for(i=0;i<p.length();i++)
{
if(p[i]!='*') t+=p[i];
else
{
star=true;
t+='*';
while(p[i]=='*'&&i<p.length()) i++;
i--;
}
}
if(star==false)
{
if(s.size()!=p.size())return false;
for(i=0;i<s.size();i++) if(!(s[i]==p[i]||'?'==p[i])) return false;
return true;
}
if(s=="") return t=="*" || p=="";
if(t=="*") return true;
for(i=0;i<t.length();i++)
{
if(t[i]=='*')
{
if(temp!="") ps.push_back(temp);
if(temp.size()>s.size()) return false;
temp="";
}
else temp+=t[i];
}
if(temp.size()>s.size()) return false;
if(temp!="") ps.push_back(temp);
if(t[0]!='*') head=1;
if(t[t.size()-1]!='*') tail=1;
if(head==1)
{
for(i=0;i<ps[0].size();i++)
{
if(!(s[i]==ps[0][i]||'?'==ps[0][i])) return false;
}
}
if(tail==1)
{
temp=s.substr(s.size()-ps[ps.size()-1].size(),ps[ps.size()-1].size());
for(i=0;i<temp.size();i++)
{
if(!(temp[i]==ps[ps.size()-1][i]||'?'==ps[ps.size()-1][i])) return false;
}
}
k=0;
for(i=0;i<s.size();i++)
{
tag=true;
start=i;
if(s.size()-i<ps[k].size()) return false;
temp=s.substr(i,ps[k].size());
for(j=0;j<temp.size();j++)
{
if(!(temp[j]==ps[k][j]||'?'==ps[k][j]))
{
tag=false;
break;
}
}
if(tag==true)
{
i=i+ps[k].size()-1;
k++;
}
if(k==ps.size()) break;
}
if(k==ps.size()) return true;
return false;
}