C C++最全剑指offer-----正则表达式匹配_剑指offer正则表达式匹配,最新大厂C C++社招面试经验汇总

img
img

既有适合小白学习的零基础资料,也有适合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)**

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值