【LeetCode10】-正则表达式匹配

方法一(递归)

实现思路

递归求解的本质就是在于遍历所有递归状态节点,寻找问题的解
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述上述文字及我自己梳理画出的思维导图,描述了匹配的三种方式。
其实递归每走到一步,都要尝试下这三种匹配方式。最终尝试得到是否匹配的结果。

匹配成功条件:匹配规则已经用空了,s也变成了空

利用了DFS的思想内核,就是每到一个状态遍历我能走的所有下一步,在这些尝试中得到结果。这道题里面的三种匹配方式就是我能走的“三种步”。

TIP: 现阶段我理解DFS(递归)的关键:递归出口,当前状态能遍历的步(有的还涉及回溯【也叫状态重置】的修改代码)

实现代码

class Solution {
    
    
public:
    bool isMatch(string s, string p) {
    
    
        if(p.length()==0){
    
    
            return s.length()==0;
        }
        bool FirstMatch=s.length()&&(s[0]==p[0]||p[0]=='.');
        if(p.length()>=2&&p[1]=='*'){
    
    //有*的情况
            return FirstMatch&&isMatch(s.substr(1),p)||isMatch(s,p.substr(2));
        }else{
    
    
            return FirstMatch&&isMatch(s.substr(1),p.substr(1));
        }
        return false;
    }
};

提交结果及分析

在这里插入图片描述
时间复杂度O( 3^( max(s,t) ) )
思考

Q: 多种尝试下,将不同中尝试抽象看成路径,其实只有一条路径能返回正确的结果,不会有别的不符合条件的结果导致最终返回的是false吗?
A: 不会,这三种情况路径返回的结果是或的关系,也就是只要有一个为真,最终的结果肯定也为真

Q: 这道题中为什么不用回溯(状态重置)?
A: 以前的题回溯是为了尝试另一种路径时不造成干扰,而这道在实现的时候相当于“并行”走了三条不同路径,传递的是新字符串彼此之间并没有干扰,所以不需要状态重置

注意:
1)firstmatch的时候,要保证s不为空
2)s往下挪的时候要保证是firstmatch的

猜你喜欢

转载自blog.csdn.net/weixin_44944046/article/details/113845984