leetcode 44. 通配符匹配
题目详情
题目链接
给定一个字符串 (s) 和一个字符模式 § ,实现一个支持 ‘?’ 和 ‘*’ 的通配符匹配。
- ‘?’ 可以匹配任何单个字符。
- ‘*’ 可以匹配任意字符串(包括空字符串)。
两个字符串完全匹配才算匹配成功。
- 说明:
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 = “ab”
输出: true
解释: 第一个 ‘’ 可以匹配空字符串, 第二个 '’ 可以匹配字符串 “dce”.- 示例 5:
输入:
s = “acdcb”
p = “a*c?b”
输出: false
我的代码
class Solution {
public:
bool isMatchString(const string &s, int sLoc, const string &p, int pLoc) {
if (pLoc >= p.size()) {
return sLoc >= s.size();
}
if (sLoc >= s.size()) {
return (pLoc + 1 == p.size()) && (p[pLoc] == '*');
}
if ((s[sLoc] == p[pLoc]) || (p[pLoc] == '?')) {
return isMatchString(s, sLoc + 1, p, pLoc + 1);
}
if (p[pLoc] == '*') {
if (pLoc + 1 == p.size()) {
return true;
}
if (p[pLoc + 1] == '?') {
for (int i = sLoc; i < s.size(); ++i) {
if (isMatchString(s, i + 1, p, pLoc + 2)) {
return true;
}
}
} else {
for (int i = sLoc; i < s.size(); ++i) {
if (s[i] == p[pLoc + 1]) {
if (isMatchString(s, i + 1, p, pLoc + 2)) {
return true;
}
}
}
}
}
return false;
}
bool isMatch(string s, string p) {
if (p.empty()) {
return s.empty();
}
string pp;
pp += p[0];
for (int i = 1; i < p.size(); ++i) {
if ((p[i] == '*') && (p[i - 1] == '*')) {
continue;
}
pp += p[i];
}
if (p == "*") {
return true;
}
if (s.empty()) {
return false;
}
return isMatchString(s, 0, pp, 0);
}
};
我的成绩
执行结果:超出时间限制
1708 / 1809 个通过测试用例
一些想法
难受,改了半天最后超出了时间限制。
执行用时为 0 ms 的范例
class Solution {
public:
bool isMatch(string s, string p) {
int i = 0, j = 0, iStar = -1, jStar = -1, m = s.size(), n = p.size();
while (i < m) {
if (j < n && (s[i] == p[j] || p[j] == '?')) {
++i, ++j;
} else if (j < n && p[j] == '*') {
iStar = i;
jStar = j++;
} else if (iStar >= 0) {
i = ++iStar;
j = jStar + 1;
} else return false;
}
while (j < n && p[j] == '*') ++j;//去除多余星号
return j == n;
}
};
思考
参考官方解答。