516. 最长回文子序列

class Solution:
    def longestPalindromeSubseq(self, s: str) -> int:
        # 本题的核心是怎么进行状态转移
        # 对于 s[l] != s[r]的情况下,s[l:r]中的最大回文子序列来自于 max(s[l:r-1],s[l+1,r])

        dp = [[0]*len(s) for _ in range(len(s))]
        lenS = len(s)
        for i in range(lenS):
            dp[i][i] = 1
        # 对DP数组,数组边界分析
        # 1. 对于左边界,在更新DP时需要取到i+1,所以i是倒序遍历 
        # 2. 对于右边界,其在左边界右边并且不能重合所以是 range(l+1,lenS)
        for l in range(lenS-2,-1,-1):
            for r in range(l+1,lenS):
                if  s[l] == s[r]:
                    dp[l][r] = dp[l+1][r-1]+2
                else:
                    
                    dp[l][r] = max(dp[l+1][r],dp[l][r-1])
        return dp[0][-1]

  

posted @ 2020-12-15 13:06  ChevisZhang  阅读(80)  评论(0编辑  收藏  举报