44. 通配符匹配(C++)---双指针贪心解题

题目详情

给定一个字符串 (s) 和一个字符模式 (p) ,实现一个支持 '?' 和 '*' 的通配符匹配。

'?' 可以匹配任何单个字符。
'*' 可以匹配任意字符串(包括空字符串)。
两个字符串完全匹配才算匹配成功。

说明:

  • 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 = "*a*b"
输出: true
解释: 第一个 '*' 可以匹配空字符串, 第二个 '*' 可以匹配字符串 "dce".


示例 5:
输入:

s = "acdcb"
p = "a*c?b"
输出: false

 

——题目难度:困难


 




分析

1.用 i 和 j 表示 s串 和 p串 中 当前匹配(待匹配)的位置,用iStart和jStart表示星号在s和p中待匹配的位置,并初始化为-1
2.如果s[i] = p[j] 或者 p[j] = '?'时,i++、j++
3.当2.的情况不满足时,如果p[j] = '*'时,iStart = i, jStart = j,然后令j++
4.如果2. 和 3.的情况不满足时,也就是发现字符不匹配且没有星号出现,判断iStart 是否 大于等于 0,如果是 则 ++iStart,i = iStart, j = jStart + 1 (这里可以理解为这是 回溯 的过程)
5.要是2. 、3. 和 4.的情况 都不满足的时候,就返回false

要注意最后当s中字符匹配完,p中字符不能有除星号以外字符。


 




-代码如下

class Solution {
public:
    bool isMatch(string s, string p) {
        int n = s.size(), m = p.size();
        int i = 0, j = 0, iStart = -1, jStart = -1;
        
        while (i < n) {
        	if (j < m && (s[i] == p[j] || p[j] == '?')) {
        		i++;
        		j++;
        	} else if (j < m && p[j] == '*') {
        		iStart = i;
        		jStart = j++;
        	} else if (iStart >= 0) {
        		i = ++iStart;
        		j = jStart + 1;
        	} else return false;
        }
        
        while (j < m && p[j] == '*') j++;
        
        return j == m;
    }
};

结果

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章