题目:
解答代码:
class Solution:
def isMatch(self, s: str, p: str) -> bool:
m, n = len(s) + 1, len(p) + 1
dp = [[False] * n for _ in range(m)]
dp[0][0] = True
# 初始化首行
# 从2开始,防止数组越界
for j in range(2, n, 2):
# start stop step
dp[0][j] = dp[0][j - 2] and p[j - 1] == '*'
# 状态转移
for i in range(1, m):
for j in range(1, n):
if p[j - 1] == '*':
# p 模式串(参与匹配的串)
# s 主串
# 有三种情况 第一,
if dp[i][j - 2]:
dp[i][j] = True # 1. 之前匹配成功,则加上*之后,通过出现0次进行和j-2位置的数据进行对比,构造矩阵
elif dp[i - 1][j] and s[i - 1] == p[j - 2]:
dp[i][j] = True # 2. 重复一次
elif dp[i - 1][j] and p[j - 2] == '.':
dp[i][j] = True # 3.重复通配符
else:
if dp[i - 1][j - 1] and s[i - 1] == p[j - 1]: # 直接就能匹配
dp[i][j] = True # 1.
elif dp[i - 1][j - 1] and p[j - 1] == '.': # 能匹配通配符
dp[i][j] = True # 2.
# 最后状态转移矩阵右下角的位置就是整个程序的最终结果
return dp[-1][-1]