[OJ] Wildcard Matching (Hard)
LintCode 192. Wildcard Matching (Hard)
LeetCode 44. Wildcard Matching (Hard)
第二次刷还是被这题虐. 其实就是跪在一个地方, 就是关于mustFail
的地方.
当*p && !*s
的时候, 说明s
已经被用完了, p
还没有被穷尽, 这种情况下要直接退出所有的递归返回false
, 因为s
都匹配不完p
, 那么s+1, s+2...
等字符串更不可能匹配p
.
class Solution {
private:
bool mustFail = false;
public:
bool isMatch(const char *s, const char *p) {
if (!s || !p) return false;
while (*s && *p && *s == *p || *p == '?') {
++s;
++p;
}
if (*p == '*') {
while (*p == '*') ++p;
if (!*p) return true;
do {
while (*s && !(*s == *p || *p == '?')) ++s;
if (isMatch(s, p)) return true;
if (mustFail) return false;
++s;
} while (*s);
return false;
}
if (*p && !*s) {
mustFail = true;
}
return !*s && !*p;
}
};
时间复杂度: O(mn)
空间复杂度: O(1)
(不考虑递归堆栈开销).