算法刻意练习-LeetCode实战30-通配符匹配(C++)——完结篇

题目:通配符匹配

原题链接:通配符匹配

这道题与之前的一道LeetCode中使用递归解决的题目类似:
正则表达式匹配
这里也贴上我对这道题的解答:
算法刻意练习-LeetCode实战18-正则表达式匹配(C++)

照着思维惯性,我就想用递归来解答,但是总是有错,无法AC,代码与错误案例放下面,就当纪念,以后万一哪天回来看看说不定想起来怎么做了(有大佬看出来错在哪里的话欢迎指正):

class Solution {
    
    
public:
    bool isMatch(string s, string p) {
    
    
        if(s.empty() && p.empty())
            return true;
        else if(!s.empty() && (s[0] == p[0] || p[0] == '?')) 
            return !s.empty() && isMatch(s.substr(1),p.substr(1));
        else if(p[0] == '*' && !s.empty())
            return isMatch(s.substr(1),p.substr(1))||isMatch(s.substr(1),p);
        else return false;
    }
};

在这里插入图片描述

下面是借鉴于题解区大佬的思路的代码,稍有改动。借用双指针实现的回溯。代码如下:

class Solution {
    
    
public:
    bool isMatch(string s, string p) {
    
    
        int i = 0, j = 0, iflag = -1, jflag = -1, m = s.size(), n = p.size();
        while(i < m){
    
    
            if(j < n && (s[i] == p[j] || p[j] == '?')){
    
    
                j++;
                i++;
            }
            else if(j < n && p[j] == '*'){
    
    
                iflag = i;    //iflag、jflag做标记用于回溯时定位
                jflag = j++;
            }
            else if(iflag >= 0){
    
     //到这时匹配不成功,回溯,更改‘*’对应的字符的数量
                i = iflag + 1;
                j = jflag;
            }
            else return false;
        }
        while(j < n && p[j] == '*') j++;
        return j == n;
    }
};

借鉴链接:双指针贪心
特别感谢此解答下面为代码加注释的朋友,不然回溯那一段还真有可能看不懂

历时一个月的算法刻意练习就这样结束了,感谢学校组织这个刻意练习的马老师,感谢一起学习的小伙伴,以后继续加油,努力刷题

题外话:

感觉厌倦是因为你停止了成长。

——尼采

猜你喜欢

转载自blog.csdn.net/DZZ18803835618/article/details/105204486