动态规划(8)

定义一个二维数组dp,dp[i][j]表示s的前i个字符和p的前j个字符是匹配的
dp[i][j]的计算方式如下

    首先设置dp[0][0]为true,因为两个空字符是匹配的
    如果i = 0, 那么表示以空字符串去匹配p的前j个字符,我们期望p[j] == , 这样之前的字符不用出现,dp[i][j] = p[j] == * and dp[i][j-2]
    如果s[i] == p[j]那么,直接看i-1, 和j-1是不是匹配的,dp[i][j] = dp[i-1][j-1]
    最后就是需要处理的情况,有两种选择,重复前字符一次,或者不要这个字符,只要其中一个能匹配就行
        不要前一个字符, dp[i][j-2]
        重复一次,需要满足条件p[j-1] == s[i] 或者p[j-1] == '.', dp[i-1][j]

最后返回dp[m][n]就是能不能匹配的结果

class Solution:
    def isMatch(self, s: str, p: str) -> bool:
        s, p = '#'+s, '#'+p
        m, n = len(s), len(p)
        dp = [[False]*n for _ in range(m)]
        dp[0][0] = True
        
        for i in range(m):
            for j in range(1, n):
                if i == 0:
                    dp[i][j] = j > 1 and p[j] == '*' and dp[i][j-2]
                elif p[j] in [s[i], '.']:
                    dp[i][j] = dp[i-1][j-1]
                elif p[j] == '*':
                    dp[i][j] = j > 1 and dp[i][j-2] or p[j-1] in [s[i], '.'] and dp[i-1][j]
                else:
                    dp[i][j] = False
        return dp[-1][-1]

作者:loick
链接:https://leetcode-cn.com/problems/zheng-ze-biao-da-shi-pi-pei-lcof/solution/dong-tai-gui-hua-er-wei-shu-zu-by-loick/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

猜你喜欢

转载自www.cnblogs.com/topass123/p/12637561.html