题目
给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 ‘.’ 和 ‘*’ 的正则表达式匹配。
‘.’ 匹配任意单个字符
‘*’ 匹配零个或多个前面的那一个元素
所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。
解题过程
思路:递归(递归永远滴神)
先考虑s空,p不空和s不空,p空的情况。
- 若s空,p不空。p长度为奇数,一定返回false;p长度为偶数,若*在奇数位上,返回true;否则返回false。
- 若s不空,p空,一定返回false。
s,p都不空。
定义as=s[0] ap=p[0] apnext为ap的下一位。apnext只有两种可能,是*或者不是。
若是 *
当as=ap或者ap=.时,
递归地看 s从下一位到最后与p(保持不变)或者s(保持不变)与p从下两位到最后。
若不相等
递归只看s(保持不变)与p从下两位到最后。
若不是 *
若as=ap或者ap=.
递归地看s从下一位到最后和p从下一位到最后
否则返回false。
解题代码:
class Solution {
public:
bool isMatch(string s, string p)
{
if(s.length()==0&&p.length()==0)
return true;
if(s.length() == 0)
{
if(p.length() %2== 1)
return false;
if(p.length()%2==0)
{
int start = 1;
while(start < p.length())
{
if(p[start] != '*')
return false;
start += 2;
}
return true;
}
}
if(p.length() == 0)
return false;
char as = s[0], ap = p[0], apnext = '\0';
if(p.length() > 1) apnext = p[1];
if(apnext =='*')
{
if(as == ap || ap == '.')
return isMatch(s.substr(1), p) || isMatch(s, p.substr(2));
else
return isMatch(s, p.substr(2));
}
else
{
if(as == ap || ap == '.')
return isMatch(s.substr(1), p.substr(1));
else return false;
}
}
};
解答情况: