[LeetCode] 44. Wildcard Matching

来源:互联网 发布:淘宝上找相似 编辑:程序博客网 时间:2024/04/27 14:41

思路:
这题好难啊, 面试遇到就跪了. 一开始只想到了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();}
0 0
原创粉丝点击