題目詳情
給定一個字符串 (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;
}
};
結果