正则表达式匹配(递归+剑指offer)

来源:互联网 发布:医疗器械软件指导原则 编辑:程序博客网 时间:2024/05/01 11:49

正则表达式匹配
  • 参与人数:660时间限制:1秒空间限制:32768K
  • 通过比例:14.97%
  • 最佳记录:0 ms|8552K(来自  高鹏)

题目描述

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


链接:http://www.nowcoder.com/practice/45327ae22b7b413ea21df13ee7d6429c?rp=3&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

题意:点可以表示任意字符,星*表示前一个字符可以出现0--n次,那么用递归来解,条件是str串和pattern串到达结尾,或者str串结尾了,pattern串没有结尾,都退出。

而递归的条件是:遇到*,则三个出口,(str+1,pattern+2),(str+1,pattern+2),(str,pattern+2),(str+1,pattern);


遇到'.' (str+1,pattern+1);


#include<cstdio>using namespace std;class Solution {public:    bool match(char* str, char* pattern)    {//        puts(str);//        puts(pattern);        if(str==NULL && pattern==NULL)            return true;        if(str==NULL || pattern==NULL)            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'))            {                //move on the next state                return matchCore(str+1,pattern+2)                //stay on the current state                || matchCore(str+1,pattern)                //ignore a '*'                || matchCore(str,pattern+2);            }            else return matchCore(str,pattern+2);        }        if(*str==*pattern||(*pattern=='.'&&*str!='\0'))        {            return matchCore(str+1,pattern+1);        }        return false;    }};int main(){    char ch1[]="";    char ga1[]="";    char *ch=ch1;    char *ga=ga1;    Solution so;    if(so.match(ch,ga))printf("true\n");    else printf("false\n");    return 0;}



0 0
原创粉丝点击