10. 正则表达式匹配

public:
        bool isMatch(string s, string p) {
        int sLength=s.length(),pLength = p.length(),i=0,j=0;//i,s的逆序号,j,p的逆序号
        bool dp[sLength+1][pLength+1];//s尾部和p尾部字符串的匹配数组,0-slength,0-plength

        
        for (int i = 0; i <= sLength; i++)
        {
           for (int j = 0; j <= pLength; j++)
           {
               dp[i][j] = false;
           }
           
        }
        
        dp[0][0] = true;//s="",p=""
        for(int i=1;i<=sLength;i++){
            if(!( s[sLength-i] <= 'z' && s[sLength-i] >= 'a')){
                return false;
            }else{
                 dp[i][0] = false;
            }
        }
        for(int i=1;i<=pLength;i++){
            if(!(( p[pLength-i] <= 'z' && p[pLength-i] >= 'a') || p[pLength-i]=='.' || p[pLength-i]=='*')){
                return false;
            }
        }        
        if(p.length()>=1){
            dp[0][1] = false;
        }
        if(p.length()>=2){
            dp[0][2] = (((p[pLength-2] >='a' && p[pLength-2]<='z')|| p[pLength-2]=='.') && p[pLength-1]=='*');
        }
        if(p.length()>=3){
            j=3;
            while (j<=pLength)
            {
                dp[0][j] = ((j%2 == 0) &&  
                            ((p[pLength-j] >='a' && p[pLength-j]<='z')|| p[pLength-j]=='.') && 
                            p[pLength-j+1]=='*' && dp[0][j-2]);
                j++;
            }
        }

        for(int i=1;i<=sLength;i++){
            for (int j = 1; j <=pLength; j++)
            {

                //1.p[j] == s[i]
                if(s[sLength-i]==p[pLength-j]||p[pLength-j]=='.'){
                    // a[s1s2...] a[p1p2...] 其中[s1s2...][p1p2...]能匹配
                    dp[i][j] = dp[i-1][j-1]; 
                    
                    if(!dp[i][j] && j>=2){
                        //a[s1s2...] a[p1p2...] 其中[s1s2...][p1p2...]不能匹配
                        // 1.p ~ a* 
                        if(p[pLength-j+1]=='*'){
                            int tempi = i;
                            dp[i][j] = (dp[i][j] || dp[tempi][j-2]);
                            
                            while (tempi>=1)
                            {
                                if(s[sLength-tempi]==p[pLength-j]|| p[pLength-j]=='.'){
                                    dp[i][j] = (dp[i][j] || dp[tempi-1][j-2]);
                                    tempi--;
                                }else{
                                    break;
                                }
                            }
                            
                        }

                        //a. aa ab 不存在匹配情况,所以不需要进行 或    
                    } 

                                 
                }else{
                     //2.p[j] != s[i],向后看    
                    // if(p[pLength-j]=='*'){
                    //     dp[i][j] = false;
                    // }
                    if(p[pLength-j]>='a' && p[pLength-j]<='z'){
                        if(j>=2 && p[pLength-j+1]=='*'){
                            //a[s1s2...] b[p1p2...] 其中[s1s2...][p1p2...]不能匹配
                            // p ~ b*   
                                dp[i][j] = dp[i][j-2];     
                        } 
                    }
                } 
                
                
                
            }
            
        }
        return dp[sLength][pLength];

    }

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值