方法转载自原博客
题目
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
思想
一开始对题目的理解有问题,这道题就卡了很长时间。首先‘.’很好理解,意思就是代替任何一个字符,且不能为空;‘*’与前一个字符n的组合,可以理解为有0个或很多个n,与‘.’的组合就是0个或很多个‘.’。
分为两个情况:1.下一位是星号:这种情况较复杂,先判断当前位是否相同。若不相同,忽略当前位和星号,则判断isMatch(s,p+2);若相同,则判断一下isMatch(s,p+2)是否为真这是截至条件,真的话就直接返回true,不为真则s自增,此举其实就是使‘*’代替很多当前位。
2.下一位不是星号,这种情况比较简单,只需要比较当前位s是否等于p或者p是‘.’,都返回isMatch(s+1,p+1)
bool isMatch(const char *s, const char *p) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
if (*p == 0) return *s == 0;
if (*(p+1) != '*')
{
if (*s != 0 && (*p == *s || *p == '.')) return isMatch(s+1, p+1);
else return false;
}
else
{
while (*s != 0 && (*s == *p || *p == '.'))
{
if (isMatch(s, p+2)) return true;
s++;
}
return (isMatch(s, p+2));
}
}