#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 
# @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]