Day 56 代码随想录动态规划 回文子串

文章目录

  • 647. 回文子串
  • 516. 最长回文子序列
    • 官方答案


647. 回文子串

   题目链接:647. 回文子串
Day 56 代码随想录动态规划 回文子串_第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: #情况一 和 情况二
                        result += 1
                        dp[i][j] = True
                    elif dp[i+1][j-1]: #情况三
                        result += 1
                        dp[i][j] = True
        return result

从j 开始 要从后往前遍历,但是不能走到i 前面,要保证 j 比 i 大。
分三种情况讨论。

516. 最长回文子序列

   题目链接:516. 最长回文子序列
Day 56 代码随想录动态规划 回文子串_第2张图片

 

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)-1,-1,-1):
            for j in range(i,len(s)):
                if s[i]==s[j]:
                    if j-i==0:
                        dp[i][j]=dp[i][j]+1
                    elif j-i==1:
                        dp[i][j]=dp[i][j-1]+1
                    elif j-i>=2 and dp[i+1][j-1]>0:
                        dp[i][j]=dp[i+1][j-1]+2
                else:
                    dp[i][j]=max(dp[i+1][j-1],dp[i][j-1],dp[i+1][j])
        return dp[0][-1]

这是自己独立写出来的,也是分情况讨论,当大于2的时候,只需要加上一头一尾再加上中间最大值就行。

官方答案

class Solution:
    def longestPalindromeSubseq(self, s: str) -> 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]

你可能感兴趣的:(算法训练营,动态规划,leetcode,算法)