📜  数据结构 |哈希|问题 5(1)

📅  最后修改于: 2023-12-03 15:40:00.469000             🧑  作者: Mango

数据结构 |哈希|问题 5

问题描述

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

示例 1: 输入:

"bbbab"

输出:

4

一个可能的最长回文子序列为 "bbbb"。

示例 2: 输入:

"cbbd"

输出:

2

一个可能的最长回文子序列为 "bb"。

思路

本题可以使用动态规划解决。定义dp[i][j]表示从i到j的子串中最长回文子序列的长度。当i=j时,该子串只有一个字符,因此dp[i][j]=1。当i<j时,需要根据s[i]s[j]的关系进行分类讨论:

  • s[i]=s[j]时,当前字符可以作为最长回文子序列的一部分,因此有dp[i][j]=dp[i+1][j-1]+2

  • s[i]!=s[j]时,当前字符不可能同时出现在最长回文子序列的两端,因此需要取当前子串中的最长回文子序列,即dp[i][j]=max(dp[i+1][j], dp[i][j-1])

最终,所求为dp[0][n-1],其中n为字符串s的长度。

代码实现
def longestPalindromeSubseq(s: str) -> int:
    n = len(s)
    dp = [[0] * n for _ in range(n)]
    for i in range(n):
        dp[i][i] = 1
    for i in range(n - 1, -1, -1):
        for j in range(i + 1, n):
            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]
复杂度分析

时间复杂度:O(n^2),其中n为字符串s的长度。动态规划需要填写二维数组dp中的所有元素,时间复杂度为O(n^2)。

空间复杂度:O(n^2),其中n为字符串s的长度。需要开辟二维数组dp来存储中间状态,空间复杂度为O(n^2)。