class Solution:
def isMatch(self, s: str, p: str) -> bool:
n, m = len(s), len(p)
dp = [[False] * (m + 1) for _ in range(n + 1)]
dp[0][0] = True # 空字符串和空模式串匹配
for i in range(m): # 模型串前i个字符如果都为*, 则对应位置的dp为True
t_pattern = set(list(p[:i + 1]))
if len(t_pattern) == 1 and '*' in t_pattern:
dp[0][i + 1] = True
else:
break
for i in range(1, n + 1):
for j in range(1, m + 1):
if p[j - 1] == '?':
dp[i][j] = dp[i - 1][j - 1]
elif p[j - 1] == '*':
dp[i][j] = dp[i][j - 1] or dp[i - 1][j]
else:
dp[i][j] = dp[i - 1][j - 1] and s[i - 1] == p[j - 1]
return dp[-1][-1]