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") → true
这道题也比较复杂,和 wildcard 有些小不同,用递归来完成,做法非常 straightforward。
要注意的一点有:".*" 是可以匹配任意字符串的,包括空字符串。
class Solution {
public:
bool isMatch(const char *s, const char *p) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
switch(*p)
{
case '.':
{
char nextChar = *(p+1);
if(nextChar == '*')
{
for(const char* sNext = s;;sNext++)
{
bool match = isMatch(sNext,p+2);
if(match) return true;
if( *sNext =='\0') return false;//如果sNext为空并且p+2也为空了,那么这时候应该已经返回了true。
}
}
else
{
return ( *s!='\0') && isMatch(s+1,p+1);
}
}
case '*':
{
return false; //Do not happen.
}
case '\0':
{
return (*s=='\0');
}
default:
{
char nextChar = *(p+1);
if(nextChar == '*')
{
for(const char* sNext=s;;sNext++)
{
bool match = isMatch(sNext,p+2);
if(match) return true;
if(*sNext!=*p) return false;
}
}
else
{
return (*s==*p) && isMatch(s+1,p+1);
}
}
}
}
};