文章目录

  • ​​1.题目​​
  • ​​2.代码​​

1.题目

  • ​​题目要求​​
  • 思路
    道题中的*表示之前那个字符可以有0个,1个或是多个,就是说,字符串 a*b,可以表示b或是 aaab,即a的个数任意,这道题的难度要相对之前那一道大一些,分的情况的要复杂一些,需要用递归 Recursion 来解,大概思路见注释

(2)

2.代码

class Solution{
public:
bool isMatch(string s, string p)
{
(1)若p为空,若s也为空,返回 true,反之返回 false。
if (p.empty()) return false;
(2)若p的长度为1,若s长度也为1,且相同或是p为 '.' 则返回 true,反之返回 false。
if (p.size()==1)
return (s.size() ==1) && (p[0] == s[0]|| p[0] == '.');
(3)若p的第二个字符不为*,若此时s为空返回 false,否则判断首字符是否匹配,且从各自的第二个字符开始调用递归函数匹配
if (p[2] != '*')
{
if (s.empty()) return false;
return (p[0] == s[0]|| p[0] == '.') && (isMatch(s.substr(1),p.substr(1)));
}

(4)若p的第二个字符为*,进行下列循环:
条件是若s不为空且首字符匹配(包括 p[0] 为点),
调用递归函数匹配s和去掉前两个字符的p(这样做的原因是假设此时的星号的作用是让前面的字符出现0次,验证是否匹配),若匹配返
回 true,
否则s去掉首字母(因为此时首字母匹配了,我们可以去掉s的首字母,而p由于星号的作用,可以有任意个首字母,
所以不需要去掉),继续进行循环
while (!s.empty() && (p[0] == s[0]|| p[0] == '.'))
{
前面的*号已经判断过了
if (isMatch(s,p.substr(2))) return true;
s=s.substr(1);
}
return isMatch(s,p.substr(2));


}

};