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
递归+memo
class Solution(object):
def isMatch(self, s, p):
"""
:type s: str
:type p: str
:rtype: bool
"""
from functools import lru_cache
@lru_cache(None)
def helper(si, pi):
if si == len(s) and pi == len(p): return True
if pi == len(p): return False
if si == len(s): return p[pi]=='*' and helper(si, pi+1)
if p[pi] == '*':
return helper(si, pi+1) or helper(si+1, pi+1) or helper(si+1, pi)
else:
return (s[si] == p[pi] or p[pi] == '?') and helper(si + 1, pi + 1)
return helper(0, 0)