剑指offer:正则表达式匹配

题目描述

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

输入

"aaa","a*a"

返回值

true

C++实现:解决了好久,需要考虑好多种情况
首先:
1.如果*str == *parttern 或者*parttern==‘.’,往下走
2.str=""和pattern=".*"返回true
3.
*str != *parttern 但是*(parttern+1) == ‘*’即这个不相等的字符出现0次,那么就可以令parttern向后走两个位置

4.不好解决的情况,判断*重复前面对应字符的个数,比如“aaaab”与“aa*b”,中间的a就重复了3次。
5."bcbbabab",".*a*a" 和 "bbbbba",".*a*a"等情况

class Solution {
public:
bool match(char* str, char* pattern)
    {
        while(*str!=''||*pattern!=''){
            //为了解决"bcbbabab",".*a*a" 和 "bbbbba",".*a*a"等情况(解决了好久)
            if(*(pattern - 1) == '.'&& *pattern == '*'){
                if(*(str - 1) != *str && *(str+1)!='')
                    if(*(pattern + 1) == '')
                        return false;
                    else
                        pattern++;
            }
            if(*str == *pattern || (*str!=''&&*pattern == '.')){ //如果匹配,则都向后移动一位
                str++;
                pattern++;
            }else if(*pattern == '*'){
                if(*str=='')//str已经匹配完成,返回true,"aaa","a*a"
                    return true;
                else{
                    --pattern;
                    //判断是继续循环还是pattern跳到下一个(解决了好久)
                    if(*str == *pattern || (*str!=''&&*pattern == '.')){
                        str++;
                        pattern++;
                    }else{
                        pattern+=2;
                    }
                }
            }else if(*++pattern=='*'){//虽然不匹配但是可以让该字符出现0次,然后pattern向后走
                pattern++;
            }else{
                return false;
            }
        }
        return true;
    }
};

还是应该把几种情况想到然后写递归比较简洁

class Solution {
public:
bool match(char* str, char* pattern)
    {
        if(*str == '' && *pattern== '')
            return true;
        if(*str != '' && *pattern == '')
            return false;
        if(*(pattern+1) != '*'){
            if(*str == *pattern || (*str != '' && *pattern == '.'))
                return match(str+1,pattern+1);
            else{
                return false;
            }
        }else{
            if (*str == *pattern || (*str != '' && *pattern == '.'))
                return match(str, pattern+2) || match(str+1, pattern);
            else
                return match(str, pattern+2);
        }
        
    }
};
原文地址:https://www.cnblogs.com/ttzz/p/13966526.html