题目:
mplement 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
思路:
(1)p的长度为0或者为1为最基础情况,为一时p[0]==s[0]或排p[0]=.都匹配
(2)p长度大于等于二时,
1.假如p[1]=’*’;
则若p[0]!=s[0] 时 则 *算作零个前面字符,p从p[2]开始与s[0]匹配;
若排p[0]=s[0] 或p[0]=’.’ 则p从p[2]与s[1]开始匹配;
2.假如p[1]!=’*’
若排p[0]=s[0] 或p[0]=’.’ 则p从p[1]与s[1]开始匹配;
则若p[0]!=s[0] 时false;
class Solution {
public:
bool isMatch(string s, string p) {
if (p.length() == 0)
{
return(s.empty());
}
if (p.length() == 1)
{
return (s.size() == 1 && (s[0] == p[0] || p[0] == '.'));
}
if (p[1] != '*')
{
if (s.empty())
return false;
return (s[0] == p[0] || p[0] == '.') && isMatch(s.substr(1), p.substr(1));
}
while (!s.empty() && (s[0] == p[0] || p[0] == '.'))
{
if (isMatch(s, p.substr(2)))
return true;
s = s.substr(1);
}
return isMatch(s, p.substr(2));
}
};