Implement regular expression matching with support for '.'
and '*'
.
'.' Matches any single character.
'*' Matches zero or more of the preceding element.
The matching should cover the entire input string (not partial).
The function prototype should be:
bool isMatch(const char *s, const char *p)
Some examples:
isMatch("aa","a") → false
isMatch("aa","aa") → true
isMatch("aaa","aa") → false
isMatch("aa", "a*") → true
isMatch("aa", ".*") → true
isMatch("ab", ".*") → true
isMatch("aab", "c*a*b") → truec*是一体的,0个或多个!!!
此题为正则表达式部分的实现。
借鉴:http://leetcode.com/2011/09/regular-expression-matching.html
利用有限自动机的思路。前部分实现字符以及"."的匹配,后面为*的,并存在一定关系。
bool isMatch(const char *s, const char *p) {
if( *p == '\0')return *s == '\0';
// 下一字符非*---》针对正则表达式
if(*(p+1) != '*')
{
return (*p == *s || (*p == '.'&& *s != '\0')) && isMatch(s+1,p+1);
}
while(*p == *s || (*p == '.'&& *s != '\0'))//处理带*的分支
{
if(isMatch(s,p+2))return true; //处理形如0个或多个重复!"aaa", "a*a"
s++;
}
return isMatch(s,p+2);//s本来就已经自增了,不必做处理
}