516. 最长回文子序列

https://leetcode-cn.com/problems/longest-palindromic-subsequence/submissions/

解法一:dp

dp[i][j]表示s[i...j]的最长回文子序列 当s[i] == s[j]时,s[i...j]的最长回文子序列由s[i+1...j-1]与头尾的s[i]s[j]构成,即dp[i][j] = dp[i+1][j-1]+2s[i] != s[j]时,s[i...j]的最长回文子序列就是s[i+1...j]s[i...j-1]中较长的,即dp[i][j] = max(dp[i+1][j], dp[i][j-1]) 边界:串长度为1,即i==j时,dp[i][j]=1;i<j时,dp[i][j]=0,因此只需要遍历上三角矩阵

class Solution:
    def longestPalindromeSubseq(self, s: str) -> int:
        n = len(s)
        if n == 1:
            return n
        dp = [[0] * n for _ in range(n)]
        for i in range(n - 1, -1, -1):
            for j in range(i, n):
                if i == j:	#对角线
                    dp[i][j] = 1
                    continue
                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][n-1]

最后更新于