[LeetCode] 44. Wildcard Matching

思路:
这题好难啊, 面试遇到就跪了. 一开始只想到了DP的思路, 但时间太慢过不去大样本, 最后discuss看了这个大神的贪心算法https://discuss.leetcode.com/topic/3040/linear-runtime-and-constant-space-solution, 通过了.
主要是用两个指针分别追踪两个字符串s和p. 如果两个s[ps]和p[pp]相同或者p[pp]是’?’的话就直接两边自加加去看下一组, 如果不是的话进第二个if条件, 那就是看当前p[pp]是不是’*’, 如果是星号, 就也没问题, 要把星号的坐标和当前ps的值都保存下来, 因为如果后面出现了匹配不上的情况后要返回来. 然后如果这个字符也不是星号, 就要像刚才说的返回到上一个星号的位置asterisk和s的lastMatch的位置进行匹配, 这里等于就是在用星号匹配字符, 直到下一个星号出现或者下一个相同字符对出现为止. 如果这里发现asterisk == -1, 那么就说明之前没有星号, 那这里就肯定无法继续匹配了, 返回假即可.
如果while循环结束了以后, 就是说明s已经遍历完了, 但不要着急, p不一定遍历完了, 如果这时候p后面还有除了星号的其他字符, 那依然失败, 所以我们再移动pp的位置, 如果没有其他字符了, pp最终的值会为p的长度值, 所以我们最终返回那个判断式.

bool isMatch(string s, string p) {
    int ps = 0, pp = 0, lastMatch = 0, asterisk = -1;
    while (ps < s.length()) {
        // s, p当前两个字符匹配
        if (s[ps] == p[pp] || p[pp] == '?')
            ps++, pp++;
        // p的字符是星号, 记录位置, 挪动pp向后一位
        else if (p[pp] == '*')
            asterisk = pp++, lastMatch = ps;
        // 以上情况都不是, 我们返回上一次星号的位置拿星号匹配
        else if (asterisk > -1)
            ps = ++lastMatch, pp = asterisk + 1;
        // 如果之前连星号都没出现过, 直接返回不匹配
        else return false;
    }
    // 看看p剩余的字符串里面有没有除了星号以外的字符
    while (pp < p.length() && p[pp] == '*') pp++;
    return pp == p.length();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值