10. Regular Expression Matching

方法一、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)));
    }


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值