美文网首页
[刷题] 剑指offer之正则表达式

[刷题] 剑指offer之正则表达式

作者: StormZhu | 来源:发表于2018-05-02 19:50 被阅读0次

题目描述

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

输入字符串为str,模式为pattern

解题思路

一看就知道用递归进行求解,主要是如何把情况分析的清楚,让代码不混乱。

主要可以将'*'表示的含义分为三类,当前字符出现0次,1次,1次以上。

根据pattern的第二个字符是不是'*'字符,将情况分为两类。

  • pattern的下一个字符为'*'字符,即*(pattern+1)=='*',此时又分为两种情况:
    1. 如果当前字符匹配,即 *str==*pattern或者*str=='.' && *pattern!='\0',根据'*'表示的含义划分为三种:
      1. 当前字符出现0次:等价于判断strpattern+2是否匹配。
      2. 当前字符出现1次:等价于判断str+1pattern+2是否匹配。
      3. 当前字符出现1次以上:等价于判断str+1pattern是否匹配。
    2. 如果当前字符不匹配,此时'*'只能表示当前字符出现0次。等价于判断strpattern+2是否匹配。
  • pattern的下一个字符不为'*'字符,即*(pattern+1)!='*',这时逻辑比较简单:
    1. 如果当前字符匹配,即 *str==*pattern或者*str=='.' && *pattern!='\0',此时等价于判断str+1pattern+1是否匹配。
    2. 如果当前字符不匹配,直接返回false即可。

递归停止条件

  • strpattern同时为结束字符'\0'的时候,说明可以匹配,返回true。
  • str还没有遍历结束,但是pattern已经结束的时候,说明已经不可能匹配了,可以直接返回false。

几个例子

  • str="", pattern=".*"
  • str="aaa", pattern="a*a"
  • str="aaa", pattern="ab*a"
  • str="aaa", pattern="ab*ac*a

代码

class Solution {  
public:  
    bool match(char* str, char* pattern)  
    {   
        return help(str, pattern);  
    }  
    //主要的递归函数
    bool help( char* str, char* pattern )  
    {  
        if( *str == '\0' && *pattern == '\0' )  
            return true;  
        if( *pattern == '\0' )  
            return false;  
          
        if( *(pattern+1) == '*' )  
        {  
            if( *str == *pattern || (*pattern == '.' && *str != '\0') )  
                return help(str, pattern+2) || help(str+1, pattern+2) || help(str+1, pattern);  
            else  
                return help(str, pattern+2);  
        }  
          
        if( *str == *pattern || (*pattern == '.' && *str != '\0') ) 
            return help(str+1, pattern+1);  
          
        return false;  
    }  
};  

参考

牛客网剑指Offer——正则表达式匹配

相关文章

网友评论

      本文标题:[刷题] 剑指offer之正则表达式

      本文链接:https://www.haomeiwen.com/subject/qozcrftx.html