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