正则表达式匹配(Java)

正则表达式匹配(Java)

题目:
请实现一个函数用来匹配包括.和∗正则表达式。模式中的字符.表示任意一个字符,而 ∗表示它前面的字符可以出现任意次(包含0次)。匹配是指字符串的所有字符匹配整个模式。
例如,字符串aaaaaaaaa与模式a.aa.aa.aab∗ac∗aabacaab∗ac∗a匹配,但是与aa.aaa.aaa.a和ab∗aab*aab∗a均不匹配。
算法描述
方法:递归(如果当前的字符匹配了,匹配剩下的字符组成的字符串,还是同样的过程,这就是递归)。
首先,扫描开始,两个指针i,j初始化为0,分别指向字符串和模式串的第一个字符
递归结束条件:
当同时扫描到了两个字符串和模式串的末尾了,这就是匹配成功
当模式串先扫描到末尾了,这是说明没有匹配成功!

递归算法逻辑关系分析:
一、如果模式串存在下一个字符,且下个字符是∗
1.如果字符串当前字符和模式串当前字符匹配:
1⃣️认为∗前面的字符出现0次,i不变,j+2
2⃣️认为∗前面的字符出现1次,i+1,j+1
3⃣️认为∗前面的字符出现多次,i+1,j不变
2.如果字符串当前字符和模式串当前字符不匹配
1⃣️认为∗前面的字符出现0次,i不变,j+2
二、如果下个字符不是∗:
1.如果字符串当前字符和模式串当前字符匹配
1⃣️匹配下个字符,i+1,j+1
2. 如果字符串当前字符和模式串当前字符不匹配
1⃣️字符串和模式串不匹配
代码:

public class Solution {
    public boolean match(char[] str, char[] pattern){
        if (str == null || pattern == null)//有一个是空串 返回false
            return false;
        return matchCore(str, 0, pattern, 0);//递归地匹配
    }
    private boolean matchCore(char[] str, int strIndex, char[] pattern, int patternIndex){
        //如果匹配同时到达末尾,则匹配成功
        if(strIndex == str.length && patternIndex == pattern.length) return true;
        //如果模式串先到达末尾,则匹配不成功
        if(strIndex != str.length && patternIndex == pattern.length) return false;
        /*如果下一个字符是'*'*/
        if(patternIndex+1<pattern.length && pattern[patternIndex+1] == '*'){
            //如果当前字符是匹配的
            if(strIndex != str.length && (str[strIndex] == pattern[patternIndex] || pattern[patternIndex] == '.'))
                return matchCore(str, strIndex, pattern, patternIndex+2) || //认为'*'前的字符出现0次
                       matchCore(str, strIndex+1, pattern, patternIndex+2) ||//认为'*'前的字符出现1次
                       matchCore(str, strIndex+1, pattern, patternIndex);//认为'*'前的字符出现多次
            else//如果当前字符不匹配的 认为'*'前的字符出现0次
                return matchCore(str, strIndex, pattern, patternIndex+2);
        }
        /*如果下一个字符不是'*'*/
        //当前字符是匹配的
        if(strIndex != str.length && (str[strIndex] == pattern[patternIndex] || pattern[patternIndex] == '.'))
            return matchCore(str, strIndex+1, pattern, patternIndex+1);
        else//当前字符是不匹配的
            return false;
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值