19 正则表达式的匹配

19 正则表达式的匹配

动态规划

在这里插入图片描述
在这里插入图片描述
思路:对于p中的一个字符而言,它只能在s中匹配一个字符,匹配的方法具有唯一性;而对于p中字符+*的组合而言,它可以在s中匹配任意个字符(包括0个),并不具有唯一性。因袭,我们可以考虑使用动态规划,对匹配方案进行枚举。

class Solution {
    public boolean isMatch(String s, String p) {
        int lenS = s.length();
        int lenP = p.length();
        
        boolean[][] f = new boolean[lenS+1][lenP+1]; 
        //空正则一定不匹配
        // if(lenP==0 ){
        //     return false;
        // }

        for(int i=0;i<=lenS;i++){
            for (int j=0;j<=lenP;j++){
                //空正则 j=0
                if(j==0){
                    f[i][j]=i==0;//巧妙!
                }
                //非空正则
                else{
                    char c;
                    //正则不是 *
                    if(p.charAt(j-1) != '*'){
                        if(i>0&&(p.charAt(j-1) == '.' || p.charAt(j-1) == s.charAt(i-1))){
                            f[i][j]=f[i-1][j-1];//
                        }
                    }else{
                        //正则是 *
                        //不看 *
                        if(j>=2){
                            f[i][j]|=f[i][j-2];
                        }
                        //看 *
                        if(i>=1 && j>=2 &&(s.charAt(i-1)==p.charAt(j-2)||p.charAt(j-2)=='.')){
                            f[i][j]= f[i][j]|f[i-1][j];
                        }
                    }
                }
            }
        }
        


       return f[lenS][lenP];

    }
}

注:第三种情况里,分为看和不看两种,对于这两种 情况,我们都要算,当然是希望尽可能地为true,而且一种情况算出来的true不会被另一种情况算出来的false抹掉,所有用 |= ,任何一种情况算出true我们都看成true。

时间复杂度 O ( m n ) O(mn) O(mn)。其中 m m m n n n分别是字符串 s s s p p p的长度。
空间复杂度 O ( m n ) O(mn) O(mn)。因为存储状态要使用空间。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值