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;
    }
};

結果

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