剑指offer面试题19:正则表达式的匹配

题目要求:请实现一个函数用来匹配包含’. ‘和’‘的正则表达式。模式中的字符’.‘表示任意一个字符,而’'表示它前面的字符(前一个)可以出现任意次(含0次)。在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"abaca"匹配,但与"aa.a"和"ab*a"均不匹配。

解题方法:使用递归解决方法
首先第一种情况:待匹配字符串为空,正则字符串只能为空或者为偶数(abc* 情形),且正则字符串的偶数位必须为* 限定
第二种情况:若待匹配字符串不为空,当正则字符串为空,则不匹配(递归结束条件)

递归:得到两个字符串的当前位字符,c1(待匹配字符串的当前位)和c2(正则字符串的当前位),用c3表示正则字符串当前位的下一位(判断是否为 * 分情况)
若c3是 *,看当前位置c1,c2是否匹配,若匹配,将字符串减一位进行递归判断

class Solution {
    public boolean isMatch(String s, String p) {
       //情况1:字符串s的长度为0
       if(s.length()==0){
           //如果正则字符串的长度为奇数,肯定不匹配  因为要么是空,要么是(a*b*c*)
        if(p.length()%2!=0){return false;}
        //如果正则字符串不是这种形式(a*b*)也不匹配
        int i=1;
        while(i<p.length()){
            //当偶数为有一个不为*号,则无法匹配空串
            if(p.charAt(i)!='*')return false;
            i+=2;
        }
        //若满足条件匹配空串成功
        return true;
       }

       //情况2:字符串s长度不为0,但是正则字符串长度为0,直接返回错误
       if(p.length()==0) return false;

       //情况3:得到s字符串与p正则字符串的当前位字符 分别为c1,c2.
        // c3则为正则字符串当前位的下一个字符串(如果存在)
        char c1=s.charAt(0),c2=p.charAt(0),c3='a';
        if(p.length()>1){
            c3=p.charAt(1);
        }
        //正则字符串:当前位的下一个字符不为*
        if(c3!='*'){
           if(c1==c2||c2=='.'){
               //当前位置匹配,递归判断下一位,
               return isMatch(s.substring(1),p.substring(1));
           }else{return false;}
        }else{
        //正则字符串: 当前位的下一个字符为*
        if(c1==c2||c2=='.'){
            //因为(某个字符*)代表该字符出现0次或无数次,所以看或者不看该正则
            return isMatch(s.substring(1),p)||isMatch(s,p.substring(2));
        }else{
            //如果第一个字符就不匹配,直接不看该正则
            return isMatch(s,p.substring(2));
        }
        }
           }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值