正则表达式匹配

来源:互联网 发布:鬼吹灯 简介 知乎 编辑:程序博客网 时间:2024/05/23 22:52

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

昨天晚上提交不通过,今天提交就能通过,也是服了。
题目明显可以实用递归进行求解,注意一下几种情况,
1、pattern中出现连续两个‘*’或者开头就是”*”的直接返回false,因为这不是正确的正则表达式。
2、如果pattern到达末尾,那么str必须到达末尾,否则直接返回不匹配
3、如果pattern没有达到末尾,但是str到达末尾,则需要单独判断之后的pattern是否是连续出现两个非“*”如果是返回false,直到遍历到pattern末尾返回true
4、对于其他情况,如果对应的pattern第二个字符不是“*”,那么直接比对当前字符,不匹配直接返回false,匹配的话pattern和str都向前加1;
5、如果对应的pattern第二个字符是‘*’那么分为以下几种情况
如果当前字符是不匹配的:

  • 可以直接将pattern后移两个字符,对应的*是代表前面出现0次的情况

如果当前字符是匹配的:

  • str直接向后移动一个,对应的*是出现2次以上的情况
  • 可以直接将pattern后移两个字符,对应的*是代表前面出现0次的情况
  • str向后移动一个,pattern向后移动2个,代表*前面的字符只出现1次的情况
class Solution {public:    bool match(char* str, char* pattern)    {        if(*pattern=='*')            return false;        char* patt=pattern;        while(*patt!='\0')            {            if(*patt=='*'&&*(patt+1)=='*')                return false;            else                 ++patt;        }        return recurmatch(str,pattern);    }   bool recurmatch(char* str, char* pattern)       {       if(*pattern=='\0'&&*str=='\0')           return true;       else if(*pattern=='\0'&&*str!='\0')           return false;       else if(*pattern!='\0'&&*str=='\0')           return judgepatt(pattern);       if(*(pattern+1)!='*')            {           if(*str==*pattern||*pattern=='.')               return recurmatch(str+1, pattern+1);           else               return false;       }          if(*pattern==*str||*pattern=='.')               return recurmatch(str+1, pattern)||recurmatch(str, pattern+2)||recurmatch(str+1, pattern+2);          return recurmatch(str, pattern+2);   }    bool judgepatt(char *patt){       while(*patt!='\0')           {           if((*patt!='*')&&(*(patt+1)!='*'))               return false;           ++patt;       }        return true;    }};
0 0
原创粉丝点击