44.wildcard-matching

本文探讨了正则表达式匹配算法的实现,通过非递归方法处理特殊字符'*'和'?',并对比了递归方法的效率问题。文章详细解析了匹配过程中的关键步骤,并提供了AC代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      这道题也是正则表达式类的题目,和10题有很大程度的相似度,个人感觉难度上来讲,这道题要简单一点,有一点需要注意的是这道题不能用递归来解决,看到有个测试用例会超时,但也可能是我自己的思路上有缺陷,如果有大神,肯请指点。

      这道题是*号表示任何字符串包括空串:"",?表示可以与任意一个字符串匹配,所以,最特殊的还是*号,我们分情况讨论,

1、假设当前p[i] = s[j] 或者 p[i] == '?',则所以同时加一。

2、假设当前p[i] == '*',则,记录当前位置的下一个位置点。s的索引值不动,主要是为了涵盖*号代表空串的情况。p的索引值+1。

3、假设当前失配,即以上两种情况都不是,则寻找上一个*号记录点,将p串的索引和s串的索引都重新放在上一个索引点处的下一个位置,让*号代表长的字串,寻找可能的匹配情况。

4、如果发生失配的情况下依然未能找到有*号记录,则说明无法完成字串匹配,返回false。

以下是AC代码:

class Solution {
public:
    bool isMatch(string s, string p) {
        int pindex = 0, sindex = 0, sstart = 0, pstart = 0;
        while (sindex < s.size()) {
            if (p[pindex] == s[sindex] || p[pindex] == '?') {
                ++pindex;
                ++sindex;
            } else if (p[pindex] == '*') {
                pstart = ++pindex;
                sstart = sindex;
            } else if (pstart) {
                pindex = pstart;
                sindex = ++sstart;
            } else {
                return 0;
            }
        }
        while (pindex<p.size() && p[pindex]=='*') {
            ++pindex;
        }
        return pindex==p.size();
    }
};

 

这道题要说一点的是,递归程序之所以会出现超时问题,重要的原因在于一旦出现连续的*号,就会让复杂度增加很多。其实在本题目中,连续的*号在某种意义上是等价存在的。其实只需要记录最新的一个即可。如果要使用递归,可以尝试先处理一下多个连续*号,然后在进行递归操作。

以下是递归代码,会发生超时,但思想和10题完全一样:

class Solution {
public:
    bool isMatch(string s, string p) {
        if (p.empty()) return s.empty();

        if (p[0] == '*') {
            return (isMatch(s, p.substr(1)) || (!s.empty() && isMatch(s.substr(1), p)));
        } else {
            return (!s.empty() && (s[0]==p[0]||p[0]=='?') && isMatch(s.substr(1), p.substr(1)));
        }
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值