剑指offer|正则表达式匹配

来源:互联网 发布:mac版办公软件下载 编辑:程序博客网 时间:2024/05/01 09:02

题目描述

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

思路:

这题学过有限状态机的话就比较简单了。
首先考虑模式当前第二个字符是不是*。

如果模式当前第二个字符不是*,那么判断字符串当前字符和模式当前字符是否相等或者模式当前字符为.,如果符合这两种情况则递归匹配下一个字符。如果不符合则返回false。

如果模式当前第二个字符是*,那么考虑字符串当前字符和模式当前字符是否相等或者模式当前字符为.,如果符合这两种情况则接着递归判断,此时共有三种情况需要判断,首先字符串向后移动一个字符,模式向后移动两个字符。再者字符串向后移动一个字符,模式不移动,最后一种是字符串不移动,模式向后移动两个字符。
如果不符合上述两种情况则接着递归判断,此时字符串不移动,模式向后移动两个字符。

class Solution {public:    bool match(char* str, char* pattern)    {        if(str == nullptr || pattern == nullptr)            return false;        return matchCore(str,pattern);    }    bool matchCore(char* str,char* pattern)    {        if(*str == '\0'  && *pattern=='\0')            return true;        if(*str != '\0' && *pattern == '\0')            return false;        if(*(pattern+1) == '*')        {            if( *str == *pattern || (*pattern == '.' && *str != '\0'))            {                return (matchCore(str+1,pattern) ||matchCore(str+1,pattern+2) || matchCore(str,pattern+2));            }            else                return matchCore(str,pattern+2);        }        if(*str == *pattern || (*pattern == '.' && *str != '\0'))        {            return matchCore(str+1,pattern+1);        }        return false;    }};
0 0
原创粉丝点击