0
点赞
收藏
分享

微信扫一扫

clean code-代码整洁之道 阅读笔记(第十三章)

Alex富贵 2024-07-24 阅读 28
算法

忙死了要。。慢慢补吧

647. 回文子串

  • 题目链接:647. 回文子串
  • 遍历顺序的确定:如果这矩阵是从上到下,从左到右遍历,那么会用到没有计算过的dp[i + 1][j - 1],也就是根据不确定是不是回文的区间[i+1,j-1],来判断了[i,j]是不是回文,那结果一定是不对的。所以一定要从下到上,从左到右遍历,这样保证dp[i + 1][j - 1]都是经过计算的
class Solution(object):
    def countSubstrings(self, s):
        """
        :type s: str
        :rtype: int
        """
        dp = [[False]*len(s) for _ in range(len(s))]
        result = 0

        for i in range(len(s)-1, -1, -1):
            for j in range(i, len(s)):
                if s[i]==s[j]:
                    if j-i<=1 or dp[i+1][j-1]==True:
                        result +=1
                        dp[i][j]=True
        return result

516.最长回文子序列

  • 题目链接:516.最长回文子序列
  • 初始化:当i与j相同,那么dp[i][j]一定是等于1的。
class Solution(object):
    def longestPalindromeSubseq(self, s):
        """
        :type s: str
        :rtype: int
        """
        dp = [[0]*len(s) for _ in range(len(s))]
        
        for i in range(len(s)):
            dp[i][i] = 1
            
        for i in range(len(s)-1, -1, -1):
            for j in range(i+1, len(s)):
                if s[i]==s[j]:
                    dp[i][j]=dp[i+1][j-1]+2
                else:
                    dp[i][j]=max(dp[i+1][j], dp[i][j-1])
        
        return dp[0][-1]
举报

相关推荐

0 条评论