#和之前通配符匹配很像,dp的思路
class Solution:
def isMatch(self, s: str, p: str) -> bool:
vertical = len(p)+1 #纵向的长度,由于有初始start因此加一
level = len(s)+1
if set(p) == {"*"}: return True # *可以匹配包括空字符
#建表
table = [[False]*level for i in range(vertical)] #初始化全为False
table[0][0] = True
if p.startswith('*'):
table[1] = level*[True]
for i in range(1,vertical):
path = False
for j in range(1,level):
if p[i-1]=='*': #判断出现'*'情况
if table[i-1][0]==True: #如果第一行为*,那全为True
table[i] = [True]*level
if table[i-1][j]: #如果上一行为True,令标志True
path = True
if path:#只要顶上有了True,就可以开通*接下来的所有道路
table[i][j]=True
elif p[i-1] == "?" or p[i-1]==s[j-1]:#先判断字母是否符合
table[i][j] = table[i-1][j-1] #再看左上方格子是不是T
return table[vertical-1][level-1]
#https://leetcode.cn/problems/wildcard-matching/solution/yi-ge-qi-pan-kan-dong-dong-tai-gui-hua-dpsi-lu-by-/
#该博主的dp讲法很清晰