【剑指offer】正则表达式匹配

来源:互联网 发布:xmind7 mac 破解版 编辑:程序博客网 时间:2024/05/01 20:21
时间限制:1秒 空间限制:32768K 热度指数:32774

本题知识点: 字符串

题目描述

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

思路:采用递归的方法。
1. 只有当str和pattern同时为'\0'时,才算成功。
2. 当*str == *pattern 或者 *pattern == '.' && *str != '\0' 时,我们就认为当前str和pattern是匹配的。
3. 每一轮,我们首先应该考虑pattern+1是不是'*',接着才是考虑当前str和pattern是否匹配,如果pattern+1是'*'
   3.1. 如果当前str和pattern匹配,此时'*'的作用可能还没有结束,还要考虑以下两种情况(任何一种情况成功都行,所以它们是'或'的关系):
     3.1.1: 匹配str+1和pattern(如果这种情况匹配成功,说明这个'*'前面的字符可能要重复两次以上)
     3.1.2: 或者匹配str和pattern+2(如果这种情况匹配成功,说明这个'*'前面的字符需要被忽略)
   3.2. 如果当前str和pattern不匹配,那么我们还有机会,忽略当前pattern和pattern+1,接着匹配当前str和pattern+2;
4. 如果pattern+1不是'*',就正常考虑当前str和pattern是否匹配。
5. 如果3和4都不能返回true,那就只能返回false咯

class Solution {  public:      bool match(char* str, char* pattern)//程序入口      {          if(str == NULL || pattern == NULL)              return false;                    return kernel(str, pattern);       }            bool kernel(char* str, char* pattern)      {          if(*str == '\0' && *pattern == '\0')              return true;                    if(*(pattern+1) == '*')          {              if(*pattern == *str || (*pattern == '.' && *str != '\0'))//如果当前str和pattern匹配                  return kernel(str+1,pattern)||kernel(str,pattern+2);//两者任何一个匹配成功都行              else                  return kernel(str,pattern+2);          }          if(*str == *pattern || (*pattern == '.' && *str != '\0'))              return kernel(str+1,pattern+1);            return false;      }  };



0 0
原创粉丝点击