Leetcode_516_最长回文子序列_hn

题目描述

给定一个字符串s,找到其中最长的回文子序列。可以假设s的最大长度为1000。

示例

示例 1:

输入:
"bbbab"
输出:
4
一个可能的最长回文子序列为 "bbbb"。

示例2:

输入:
"cbbd"
输出:
2
一个可能的最长回文子序列为 "bb"。

解答方法

方法一:动态规划

思路

  • 状态
    dp[i][j] 表示 s 的第 i个字符到第 j个字符组成的子串中,最长的回文序列长度是多少。
  • 转移方程
    如果 s 的第 i 个字符和第 j 个字符相同的话
    dp[i][j] = f[i + 1][j - 1] + 2
    如果 s 的第 i 个字符和第j个字符不同的话
    dp[i][j] = max(f[i + 1][j], f[i][j - 1])
    然后注意遍历顺序,i 从最后一个字符开始往前遍历,ji + 1 开始往后遍历,这样可以保证每个子问题都已经算好了。
  • 初始化
    dp[i][i] = 1单个字符的最长回文序列是1
  • 结果
    dp[0][n-1]
    https://leetcode-cn.com/problems/longest-palindromic-subsequence/solution/zi-xu-lie-wen-ti-tong-yong-si-lu-zui-chang-hui-wen/

代码

class Solution:
    def longestPalindromeSubseq(self, s: str) -> int:
        dp = [[0] * len(s) for i in range(len(s))]
        for i in range(len(s)-1, -1, -1):
            dp[i][i] = 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][len(s)-1]

时间复杂度

O(n^2)

空间复杂度

你可能感兴趣的:(Leetcode_516_最长回文子序列_hn)