📜  门| GATE-CS-2006 |第 41 题(1)

📅  最后修改于: 2023-12-03 14:58:26.939000             🧑  作者: Mango

题目介绍

这道题是GATE-CS-2006的第41题。它是一道关于编程的问题,需要编写一个程序来求解给定字符串中最长的回文子序列。

题目分析

首先,观察题目,我们可以发现这是一个典型的动态规划问题。我们可以使用一个二维数组dp[i][j]来表示从i到j子字符串中最长的回文子序列长度。其中i<=j。

接下来,我们需要考虑状态转移方程。假设当前子字符串为s[i:j],那么可以分两种情况:

  1. s[i] == s[j],即首尾两个字符相同,则最长回文子序列长度应该加2,即dp[i][j] = dp[i+1][j-1] + 2。
  2. s[i] != s[j],即首尾两个字符不同,则应该取dp[i+1][j]和dp[i][j-1]中的较大值。

最后,初始化dp[i][i]为1,因为单个字符本身就是一个回文子序列。

代码实现

def longest_palindrome_subsequence(s: str) -> int:
    n = len(s)
    dp = [[0] * n for _ in range(n)]
    for i in range(n):
        dp[i][i] = 1
    for left in range(n-2, -1, -1):
        for right in range(left+1, n):
            if s[left] == s[right]:
                dp[left][right] = dp[left+1][right-1] + 2
            else:
                dp[left][right] = max(dp[left+1][right], dp[left][right-1])
    return dp[0][n-1]

以上就是本题的详细分析和代码实现。