题目详情
给定一个字符串 (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;
}
};
结果