leetcode 44. 通配符匹配

leetcode 44. 通配符匹配

题目详情

题目链接
给定一个字符串 (s) 和一个字符模式 § ,实现一个支持 ‘?’ 和 ‘*’ 的通配符匹配。

  • ‘?’ 可以匹配任何单个字符。
  • ‘*’ 可以匹配任意字符串(包括空字符串)。

两个字符串完全匹配才算匹配成功。

  • 说明:
    s 可能为空,且只包含从 a-z 的小写字母。
    p 可能为空,且只包含从 a-z 的小写字母,以及字符 ? 和 *。
  • 示例 1:
    输入:
    s = “aa”
    p = “a”
    输出: false
    解释: “a” 无法匹配 “aa” 整个字符串。
  • 示例 2:
    输入:
    s = “aa”
    p = ""
    输出: true
    解释: '
    ’ 可以匹配任意字符串。
  • 示例 3:
    输入:
    s = “cb”
    p = “?a”
    输出: false
    解释: ‘?’ 可以匹配 ‘c’, 但第二个 ‘a’ 无法匹配 ‘b’。
  • 示例 4:
    输入:
    s = “adceb”
    p = “ab”
    输出: true
    解释: 第一个 ‘’ 可以匹配空字符串, 第二个 '’ 可以匹配字符串 “dce”.
  • 示例 5:
    输入:
    s = “acdcb”
    p = “a*c?b”
    输出: false

我的代码

class Solution {
public:
    bool isMatchString(const string &s, int sLoc, const string &p, int pLoc) {
        if (pLoc >= p.size()) {
            return sLoc >= s.size();
        }
        if (sLoc >= s.size()) {
            return (pLoc + 1 == p.size()) && (p[pLoc] == '*');
        }
        if ((s[sLoc] == p[pLoc]) || (p[pLoc] == '?')) {
            return isMatchString(s, sLoc + 1, p, pLoc + 1);
        }
        if (p[pLoc] == '*') {
            if (pLoc + 1 == p.size()) {
                return true;
            }
            if (p[pLoc + 1] == '?') {
                for (int i = sLoc; i < s.size(); ++i) {
                    if (isMatchString(s, i + 1, p, pLoc + 2)) {
                        return true;
                    }
                }
            } else {
                for (int i = sLoc; i < s.size(); ++i) {
                    if (s[i] == p[pLoc + 1]) {
                        if (isMatchString(s, i + 1, p, pLoc + 2)) {
                            return true;
                        }
                    }
                }
            }
        }
        return false;
    }

    bool isMatch(string s, string p) {
        if (p.empty()) {
            return s.empty();
        }
        string pp;
        pp += p[0];
        for (int i = 1; i < p.size(); ++i) {
            if ((p[i] == '*') && (p[i - 1] == '*')) {
                continue;
            }
            pp += p[i];
        }
        if (p == "*") {
            return true;
        }
        if (s.empty()) {
            return false;
        }
        return isMatchString(s, 0, pp, 0);
    }
};

我的成绩

执行结果:超出时间限制
1708 / 1809 个通过测试用例

一些想法

难受,改了半天最后超出了时间限制。

执行用时为 0 ms 的范例

class Solution {
public:
    bool isMatch(string s, string p) {
        int i = 0, j = 0, iStar = -1, jStar = -1, m = s.size(), n = p.size();
        while (i < m) {
            if (j < n && (s[i] == p[j] || p[j] == '?')) {
                ++i, ++j;
            } else if (j < n && p[j] == '*') {
                iStar = i;
                jStar = j++;
            } else if (iStar >= 0) {
                i = ++iStar;
                j = jStar + 1;
            } else return false;
        }
        while (j < n && p[j] == '*') ++j;//去除多余星号
        return j == n;
    }
};

思考

参考官方解答

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值