Implement wildcard pattern matching with support for '?'
and '*'
.
'?' Matches any single character. '*' Matches any sequence of characters (including the empty sequence). The matching should cover the entire input string (not partial). The function prototype should be: bool isMatch(const char *s, const char *p) Some examples: isMatch("aa","a") ? false isMatch("aa","aa") ? true isMatch("aaa","aa") ? false isMatch("aa", "*") ? true isMatch("aa", "a*") ? true isMatch("ab", "?*") ? true isMatch("aab", "c*a*b") ? false
思路:
先是递归,不能过大集合;
循环可以过,但是p == '*'的情况需要特殊处理,用两个指针记录p == '*'时的s和p的位置。
因为p的*可以代表很多字符,需要确定*代表s中的那些字符
代码:
递归版
class Solution { public: bool isMatch(const char *s, const char *p) { if (*p == '*') { while (*p == '*') p++; if (*p == '\0') return true; while (*s != '\0' && !isMatch(s, p)) s++; return *s != '\0'; } else if (*p == '\0' || *s == '\0') return *p == *s; else if (*p == '?' || *p == *s) return isMatch(++s, ++p); else return false; } };
循环版
class Solution { public: bool isMatch(const char *s, const char *p) { if (!s && !p) return true; const char *ss = NULL; const char *sp = NULL; while (*s) { if (*s == *p || *p == '?') { s++; p++; } else if (*p == '*') { while (*p == '*') p++; if (*p == '\0') return true; ss = s; sp = p; } else if ((*p == '\0' || *p != *s) && sp) { s = ++ss; p = sp; } else return false; } while (*p) if (*p++ != '*') return false; return true; } };