剑指offer-题53:正则表达式匹配

本文介绍了一种实现正则表达式匹配的算法,重点讨论了包含'.'和'*'的模式匹配方法,并通过Java代码详细展示了算法的具体实现。

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

题目描述

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

实验平台:牛客网


解决思路:

这题需要分以下两种情况:

1.当模式中索引位置后面一个位置的字符不是’*’时:如果字符串中索引位置的字符和模式中索引位置字符相同或者模式中索引位置的字符是’.’,则继续比较字符串和模式的下一个索引位置的字符。如果不同,则直接返回false。例如: aa 和 ab(模式) ,索引为0时字符相同,且模式中索引为1的位置不是’.’,继续比较,当索引为1时字符不同,此时返回false。

2.当模式中索引位置后面一个位置的字符是’*’时:

如果字符串中索引位置的字符和模式中索引位置字符相同或者模式中索引位置的字符是’.’,此时可以把字符中的索引后移1位,模式中索引不变。也可以把字符中的索引不动,模式中的索引后移2位。例如: aab 和 a*b(模式),索引为0时字符相同,如果字符中索引后移1位,模式中的索引不变。当字符中索引为1,模式中的索引为0时仍然匹配,此时字符中的索引再后移1位,则字符中索引位置的字符是’b’,和模式中索引位置的字符不同,模式中索引后移两位继续比较,此时字符都相同,也匹配完毕,则返回true。又例如:ab 和 a *ab,此时需要模式中的索引后移2位,继续比较才能匹配成功

如果字符串中索引位置的字符和模式中索引位置字符不同,模式后移2位继续比较。例如:abc 和 b*abc(模式) ,索引为0时不匹配,模式中索引后移2位指向字符’a’,接着继续后面的比较

java:

public class Solution {
    public boolean match(char[] str, char[] pattern) {
        if (str == null || pattern == null) {
            return false;
        } else if (str.length == 0 && pattern.length == 0) {
            return true;
        }
        return matchCore(str, pattern, 0, 0);
    }

    public boolean matchCore(char[] str, char[] pattern, int strIndex, int patternIndex) {
        int strLength = str.length;
        int patternLength = pattern.length;
        if (strIndex == strLength && patternIndex == patternLength) {
            return true;
        }
        if (strIndex != strLength && patternIndex == patternLength) {
            return false;
        }
        if (patternIndex + 1 < patternLength && pattern[patternIndex + 1] == '*') {
            if ((strIndex < strLength && str[strIndex] == pattern[patternIndex])
                    || (pattern[patternIndex] == '.' && strIndex < strLength)) {
                return matchCore(str, pattern, strIndex, patternIndex + 2)
                        || matchCore(str, pattern, strIndex + 1, patternIndex);
            } else {
                return matchCore(str, pattern, strIndex, patternIndex + 2);
            }
        } else if (patternIndex < patternLength && strIndex < strLength
                && (str[strIndex] == pattern[patternIndex] || (pattern[patternIndex] == '.'))) {
            return matchCore(str, pattern, ++strIndex, ++patternIndex);
        }
        return false;
    }
}

python:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值