#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
#
# @param str string字符串
# @param pattern string字符串
# @return bool布尔型
#
class Solution:
def match(self , str: str, pattern: str) -> bool:
# write code here
if str == None and pattern == None:
return True
if pattern == None or str == None:
return False
n = len(str)
m = len(pattern)
dp = [[False for i in range(m+1)] for j in range(n+1)]
dp[0][0] = True
for j in range(2,m+1):
if pattern[j - 1] == '*':
dp[0][j] = dp[0][j-2]
for i in range(1, n+1):
for j in range(1, m+1):
# 第一个字符一定不是*
# 判断是否为* 不是就进入下一层
if pattern[j - 1] != '*':
# 判断是否为. 或者匹配 进入状态转移方程
if pattern[j - 1] == '.' or str[i-1] == pattern[j-1]:
dp[i][j] = dp[i-1][j-1]
else:
# 第j-1个是否与str相等
# dp数组从0个字符开始 但是pattern从1个字符开始 故索引相差1
# 先判断pattern[j-2] == str[i-1]
if pattern[j-2] != str[i-1] and pattern[j-2] != '.':
dp[i][j] = dp[i][j-2]
else:
# 匹配0个 匹配1个 匹配n个
dp[i][j] = dp[i][j-2] or dp[i][j-1] or dp[i-1][j]
return dp[n][m]