正则表达式匹配★★★

题目描述

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

aaa a*aaa
abbbc ab*c
abc ab*c
abcaaab a.*a.b

 
解题思路:
问题的核心在于对“*”的情况分析。
如果当前字符的下一个字符不是“*”,那么如果当前字符不匹配就返回失败,否则递归下一个字符位置。
如果当前字符的下一个字符是“*”,那么需要考虑两种情况:1.匹配0个,不管当前字符是否相同,都需要pattern+2向后走2个字符; 2.匹配一个或者匹配多个,那么当前字符肯定是相同的,我们让str+1向后走1个字符,匹配一个的就变成匹配0个的情况,匹配多个的只需要一直向后匹配即可。
class Solution {
public:
    bool match(char* str, char* pattern)
    {
        //同时走到尾部表示匹配成功
        if(*str == '\0' && *pattern == '\0')
            return true;
        //如果字符串没有结束,模式串结束了,则表示匹配失败
        //如果模式串没有结束,而字符串结束了,那么还有可能是匹配0个的情况存在
        if(*str != '\0' && *pattern == '\0')
            return false;
        //根据当前字符的下一个字符判断是否是*
        if(*(pattern+1) != '*'){
            if(*str == *pattern || ( *str != '\0' && *pattern == '.' )){
                return match(str+1, pattern+1);
            }else{
                return false;
            }
        }else{
            if(*str == *pattern|| ( *str != '\0' && *pattern == '.' ) ){
                //即使当前字符相同,也可以匹配0个
                bool matchZero = match(str, pattern+2);
                //匹配一个和多个算是一种情况,匹配一个在下次递归中会转化成匹配0次的情况
                bool matchOneMulti = match(str+1, pattern);
                return matchZero || matchOneMulti;
            }else{
                //匹配0个的情况
                return match(str, pattern+2);
            }
        }
    }
}

  

posted @ 2019-04-12 11:13  tcgoshawk  阅读(215)  评论(0编辑  收藏  举报