RegularExpressionMatching

来源:互联网 发布:linux init 1 编辑:程序博客网 时间:2024/06/09 16:02

正则表达匹配问题

看似问题复杂,其实理清了也就OK了,情况要分清楚!

不能一堆逻辑堆在一起,必然漏洞百出就跟之前一道题目“判断一个字串是不是数字的问题”,各种Try才通过,很不理想。

这个题一开始我也陷入了这样的困局,所以走不出来了。

思路:

1.找到问题的关键,关键在于p串的*,导致了各种情况的发生。还有就是s串中重复的字符。

2.既然p中的*最为关键,则按此分情况讨论:

p的第二个字符是不是*:

1.是  就要看看第一个s与p是不是相同,是相同则要开始去除s中相同的字符(通过s++实现),这个过程一定不能直接去除s,s往后挪一次,则要递归一次去除后的字串与p+2是否匹配,否则像(s="aab" p="a*c*ab)的情况就无法匹配了。去除之后,则继续递归调用去匹配s与p+2;

2.不是 这种情况稍微简单些,p+1不是*则说明都是字符,*s == *p就去掉头继续递归匹配了,否则就返回false没商量。


代码:

bool isMatch(char* s, char* p) {    if(!*p)    {        if(!*s) return true;        else return false;    }    if(*(p+1) == '*')    {        while(*s == *p || (*s && *p == '.'))        {            if(isMatch(s,p+2)) return true;            s++;        }        return isMatch(s,p+2);    }    else    {        if(*s && (*s == *p || *p == '.'))        {            return isMatch(s+1,p+1);        }        else        {            return false;        }    }}