剑指offer(牛客网) 正则表达式匹配

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

public class Solution {
    public boolean match(char[] str, char[] pattern)
    {
        String s = String.valueOf(str);
        String p = String.valueOf(pattern);
        return helper(s,0,p,0);
    }

    private boolean helper(String s, int curs, String p, int curp) {
        //两个都匹配完了肯定是对的
        if(curs >= s.length() && curp >= p.length()) return true;
        //正则完了字符串还没完肯定是错的
        if(curs < s.length() && curp >= p.length()) return false;
        if(curp + 1 < p.length() && p.charAt(curp + 1) =='*'){
            //下一个是*
            if(curs >= s.length()){
                //字符串已经匹配完了,当前的x*取0个x,还不一定对错
                return helper(s, curs, p, curp + 2);
            }else{
                if(s.charAt(curs) == p.charAt(curp) || p.charAt(curp) == '.'){
                    //如果正则和字符串的字符相等或者为.时,要看三种情况之一,
                    //一种是当前x*取0个x(可能后面还有x*),
                    //一种是当前字符匹配,之后的正则依然用当前的.
                    //一种是当前正则x*就只匹配当前字符
                    return helper(s, curs, p, curp + 2) || helper(s, curs + 1, p, curp) || helper(s, curs + 1, p, curp + 2);
                }else{
                    //如果当前正则和当前字符没法匹配,那么只能看下一个正则是否匹配
                    return helper(s, curs, p, curp + 2);
                }
            }
        }else{
            if(curs >= s.length()) {
                //如果当前正则不是x*,且字符串匹配完了,那么一定不匹配
                return false;
            }else{
                if(s.charAt(curs) == p.charAt(curp) || p.charAt(curp) == '.'){
                    //字符和正则各用掉一个
                    return helper(s,curs + 1, p,curp + 1);
                }else{
                    //只要有一个不匹配就是错
                    return false;
                }
            }
        }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值