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)(不考虑递归堆栈开销)