剑指offer 正则表达式匹配

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

这些分类很多,并a对边界需要处理的题目确实是很麻烦,
一开始不理解类似aba和.*a匹配也是成功。
其实是由于*匹配了前面的.表示这之前是什么字母都是合理的

思路:
一.
1.两者都匹配到结尾时 匹配成功
2.模式到结尾,字符串未到结尾 匹配失败

此时能保证模式没到结尾,字符串还不一定是否到

主要对*进行考虑

二.
1.如果模式第二个字符是*,并且第一个字符和字符串第一个字符匹配,则分类讨论(1.不匹配,模式index+2 2.只匹配1个,不继续匹配,字符串index + 1,模式index + 2 3,匹配1个字符并且继续用当前模式匹配,字符index+1,模式index不变)

2.模式第二个不是*,那么只要比较各自的第一个字符是否匹配
代码如下

public boolean match(char[] str, char[] pattern,int begin1, int begin2){
        //均达到结尾,匹配成功
        if(begin1 == str.length && begin2 == pattern.length) return true;
        //pattern达到结尾
        if(begin2 == pattern.length) return false;

        //pattern 第二个字符是*
        if (begin2 + 1 < pattern.length && pattern[begin2 + 1] == '*') {
            if(begin1 < str.length && (str[begin1] == pattern[begin2] || pattern[begin2] == '.')){
                return match(str,pattern,begin1,begin2 + 2)
                        ||match(str,pattern,begin1+1,begin2+2)
                        ||match(str, pattern, begin1 + 1, begin2);
            }else {
                return match(str, pattern, begin1, begin2 + 2);
            }
        }

        if((begin1 != str.length && pattern[begin2] == str[begin1])||(begin1 != str.length && pattern[begin2]=='.')){
            return match(str, pattern, begin1 + 1, begin2 + 1);
        }
        return false;


    }

这个题在leetcode上撞到好几次了,一直觉得麻烦,就没有做了,今天终于ac了,算了却一个心结

猜你喜欢

转载自blog.csdn.net/ymybxx/article/details/79853579