一维数组字符串4.正则表达式匹配

正则表达式匹配

给出一个字符串str和一个正则表达式字符串pattern,求这个字符串是否满足str。这个我就不用动态规划做了,就用普通的方法
主要有.和*两种符号,.表示任何字符,*表示前面的字符可以出现任意次。
总体思路就是两个字符串往前推进,如果一个到最后的时候另一个也到最后,则说明匹配成功。然后分情况为第二个字符为*和不为*两种,因为其实.表示的意思和普通字符是一样的,只不过普通字符是一样才推进,而.是所有的都能推进。
进入算法之后先看是否为null,为null肯定为false,然后进入递归
如果此时pattern和str都到达终点,则返回true。
如果只有pattern到终点,则返回false。
现在还要考虑的就是pattern未到终点,而第二个为*。而str已到中点。注意除此之外其他的所有都要判断str未到终点,不让它进入别的判断
如果此时pattern第二个为*(注意判断j+1没有超出),若str未到终点,则有三种处理方法分别是i+1,j+2;i+1,j;i,j+2;
不是这种情况就是str到终点,则返回i,j+2
如果pattern的j+1不为*,则在str未到终点的时候匹配或者时pattern[j]为.则都前进。
最后都没有的话就返回false;
加个备忘录可以很有效的提高效率

class Solution {
    int[][] memo;
    public boolean isMatch(String s, String p) {
        if(s==null || p==null){
            return false;
        }
        memo=new int[s.length()+1][p.length()+1]; 
        return core(s,0,p,0);
    }
    public boolean core(String s, int i1,String p,int i2){
        if(memo[i1][i2]!=0)return memo[i1][i2]==1; 
        if(i1==s.length() && i2==p.length()){
            return true;
        }
        if(i2==p.length()){//字符串到头时只有一种情况可以通过就是p剩下.*可以通过
            return false;
        }
        if(i2+1<p.length() &&p.charAt(i2+1)=='*'){//处理第二个是*的情况
            if(i1<s.length() && (p.charAt(i2)=='.'|| s.charAt(i1)==p.charAt(i2)) ){
                boolean r=core(s,i1+1,p,i2)||core(s,i1,p,i2+2)||core(s,i1+1,p,i2+2);
                if(r)memo[i1][i2]=1;
                else memo[i1][i2]=-1;
                return r;
            }else{
                boolean r=core(s,i1,p,i2+2);
                if(r)memo[i1][i2]=1;
                else memo[i1][i2]=-1;
                return r;
            }
        }else{//处理第二个不是*的情况,还有字符串到头的情况
           if(i1<s.length() &&(p.charAt(i2)=='.'|| s.charAt(i1)==p.charAt(i2))){
               boolean r=core(s,i1+1,p,i2+1);
                if(r)memo[i1][i2]=1;
                else memo[i1][i2]=-1;
                return r;
            }else{
                memo[i1][i2]=-1;
                return false;
            }
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值