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

2018-05-02  本文已影响0人  StormZhu

题目描述

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

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

解题思路

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

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

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

递归停止条件

几个例子

代码

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——正则表达式匹配

上一篇 下一篇

猜你喜欢

热点阅读