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)
(不考慮遞歸堆棧開銷)