既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
如果p的第二个字符为‘*’
对于这种情况,就比较复杂了。
首先看个例子:
s : “pq”
p : “d*pq”
情况一:’*'的匹配字符为0个时
s 和 p 分别为如上字符串,此时p的第二个字符为‘*’,这时,我们保持s不变,p直接略过这两个字符,截取剩下的子字符串,如下图所示:
此时,即‘*’的匹配为0个,显然上述字符匹配成功,结束。
情况二:’*'的匹配字符为1个或多个时
s : “ffghj”
p : “f*ghj”
s 和 p 分别如上字符串,此时p 的第二个字符为‘*’,这时,我们保持p不变,如果字符匹配,那么我们就截取s 即去掉s的首元素,去掉s的首元素后变为"fghj",如下图所示:
如上图所示,在进行匹配之后,发现第一个字符还是匹配的,因此,我们继续上面的匹配,如下图:
如上图所示,两次匹配后编程上图所示,我们发现这种情况不就是情况一对应的吗?即此时利用情况一即可完成匹配,如下图所示:
下面我们再来看另一种情况:
s : “ffghj”
p : “f*fbc”
这种情况与上面唯一的区别就是在*后面又出现了前面匹配过得字符,我们看一下匹配结果:
首先按照情况二匹配:第一个字符匹配成功,如下图
继续按照情况二匹配:
此时,我们发现这最终的结果是失败的。
然而当我们按照情况一进行匹配时,如下图:
我们发现也不匹配,然而实际山这个s 和 p是匹配的,我们看一下下面的匹配方式:
即刚开始我们首先使用情况二进行匹配,匹配后变成如上情况,接着我们再按照情况一进行匹配,如下:
我们发现这样就会匹配成功。
总结:对于p的第二个字符为\*的这种情况,如果只是单一的按照情况一或者情况二进行匹配都会失败,当他们俩结合时可能会匹配成功,是否成功这取决于情况一和情况二遍历的顺序。如果s 和 p 本身就是匹配的,那么只要对所有情况进行遍历,那么总会找到一种成功的匹配路径,而递归就有包括潜在意义上的遍历,因此,只要s 和 p 本身是匹配的,那么我们通过递归一定能找到一种方法来完成匹配。
代码如下
class Solution {
public:
bool match(const string& str,const string& pattern){
if(pattern.empty())
return str.empty();
//有\*的情况
bool first_match = !str.empty() && (str[0] == pattern[0] || pattern[0] == '.');
if(pattern.size() >= 2 && pattern[1] == '\*'){
return match(str, pattern.substr(2)) ||
(first_match && match(str.substr(1),pattern));
}else{//无\*的情况
return first_match && match(str.substr(1), pattern.substr(1));
}
![img](https://img-blog.csdnimg.cn/img_convert/7d56ac668d32dddce0c6b28285fb21d5.png)
![img](https://img-blog.csdnimg.cn/img_convert/1c8bb65f05fd77af938e10108ccd33cf.png)
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618668825)**
、讲解视频,并且后续会持续更新**
**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618668825)**