zoukankan      html  css  js  c++  java
  • 动态规划(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)
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 相关阅读:
    总结一下vue里一些小技巧
    vue使用过程常见的一些问题
    Vue.js 的几点总结Watchers/router key/render
    Hibernate-3
    Hibernate-2
    Hibernate-1
    百词斩一面9.17
    vivo一面凉经
    中兴技术面被怼面经
    红黑树
  • 原文地址:https://www.cnblogs.com/topass123/p/12637561.html
Copyright © 2011-2022 走看看