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

来源:互联网 发布:结婚录像制作软件 编辑:程序博客网 时间:2024/05/01 05:46

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

分析:想到的方法就是递归了。首先模式的第二个字符是’*’时,若str字符和模式字符相等或str字符不为’\0’且模式字符为’.’,递归返回三种情况的或值。情况1,模式*之前的字符出现0次,则str,pattern+2;情况2. 模式*之前的字符出现1次,则str+1,pattern+2;情况3 模式*之前的字符出现2次以上,则str+1,pattern;否则str既不和模式字符相等也不满足tr字符不为’\0’且模式字符为’.’的情况,只能按*之前的字符出现0次算了,即str,pattern+2。

模式的第二个字符不为’*’时,若str字符和模式字符相等或str字符不为’\0’且模式字符为’.’,则str+1,pattern+1;否则返回false;

递归出口:当str字符和模式字符都为’\0’,返回true;当str字符不为’\0’且模式字符为’\0’时返回false;

程序:

    bool match(char* str, char* pattern)    {        if(*str=='\0'&&*pattern=='\0') return true;if(*str!='\0'&&*pattern=='\0') return false;        if(*(pattern+1)=='*'){            if(*str==*pattern||*str!='\0'&&*pattern=='.')                return match(str,pattern+2)||match(str+1,pattern+2)||match(str+1,pattern);            else return match(str,pattern+2);        }        if(*str==*pattern||*str!='\0'&&*pattern=='.')  return match(str+1,pattern+1);        return false;    }


原创粉丝点击