剑指offer第2版19题:正则表达式匹配

本文介绍了一种实现正则表达式匹配的算法,重点讨论了包含'.'和'*'的模式匹配问题。通过详细的代码解析,展示了如何处理各种边界情况,并提供了完整的Java实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

小渣渣的算法学习笔记:2018秋招备战


数据结构类算法总结:字符串



1.题目描述:

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

2.代码实现:

public class Solution19 {

    public static void main(String[] args) {
        Solution19 s = new Solution19();
        String str = "aaa";
        String pat = "ab*ac*a";
        char[] ctr = str.toCharArray();
        char[] cat = pat.toCharArray();
        boolean b = s.match(ctr,cat);
        System.out.println(b);
    }

    public boolean match(char[] str,char[] pattern){
        return matchCore(str,0,str.length,pattern,0,pattern.length);
    }

    public boolean matchCore(char[] str,int i,int length1,
                             char[] pattern,int j,int length2){
        //1.最终结束条件:目标串和模式串都扫描到结尾
        if(i==length1 && j==length2) return true;
        //2.目标串到达结尾&&模式串未达到结尾
        if(i==length1 && j!=length2){
            while(j!=length2){
                if(pattern[j]!='*'&&(j+1>=length2||pattern[j+1]!='*')){
                    return false;
                }
                j++;
            }
            return true;
        }
        //3.目标串未达到结尾&&模式串已到达结尾
        if(i!=length1 && j==length2) return false;
        //4.模式串+1到达结尾
        if(j+1==length2){
            if(str[i] == pattern[j] || pattern[j] == '.'){
                return matchCore(str,i+1,str.length,pattern,j+1,pattern.length);
            }else{
                return false;
            }
        }
        //5.模式串匹配 模式串下一个位置不为*
        if((str[i] == pattern[j] || pattern[j] == '.')&& pattern[j+1] != '*'){
            return matchCore(str,i+1,str.length,pattern,j+1,pattern.length);
        }
        //6.模式串匹配 模式串下一个位置为*
        if((str[i] == pattern[j] || pattern[j] == '.')&& pattern[j+1] == '*'){
            return matchCore(str,i,str.length,pattern,j+2,pattern.length)
                    || matchCore(str,i+1,str.length,pattern,j,pattern.length);
        }
        //7.模式串+1 结尾为*
        if(pattern[j+1] == '*'){
            return matchCore(str,i,str.length,pattern,j+2,pattern.length);
        }

        return false;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值