python
class Solution:
def isMatch(self, s: str, p: str):
m, n = len(s), len(p)
map = dict()
def dp(s, p, i, j):
if j == n:
return i == m
if i == m:
for k in range(j, n):
if p[k] != '*':
return False
return True
key = (i, j)
if key in map.keys():
return map[key]
res = True
if s[i] == p[j] or p[j] == '?':
res = dp(s, p, i+1, j+1)
elif p[j] == '*':
res = dp(s, p, i, j+1) or dp(s, p, i+1, j)
else:
res = False
map[key] = res
return res
return dp(s, p, 0, 0)