题目:通配符匹配
原题链接:通配符匹配
这道题与之前的一道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;
}
};
借鉴链接:双指针贪心
特别感谢此解答下面为代码加注释的朋友,不然回溯那一段还真有可能看不懂
历时一个月的算法刻意练习就这样结束了,感谢学校组织这个刻意练习的马老师,感谢一起学习的小伙伴,以后继续加油,努力刷题
题外话:
感觉厌倦是因为你停止了成长。
——尼采