【leetCode】Wildcard Matching

题意:通配符匹配,有两个通配符:

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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值