📌  相关文章
📜  国际空间研究组织 | ISRO CS 2014 |问题 31(1)

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

国际空间研究组织 | ISRO CS 2014 | 问题 31

题目描述

给定一个由字母组成的字符串,找出该字符串中存在的最长回文子序列的长度。

输入格式

输入的第一行包含一个整数 T,表示测试用例的数量。接下来的 T 行包含一个字符串。

输出格式

对于每个测试用例,输出该字符串中存在的最长回文子序列的长度。

样例输入
2
ABBDCACB
GGGEEKS
样例输出
5
5
解题思路

最长回文子序列是一道经典问题,可以使用动态规划求解。设 dp[i][j] 表示字符串从 i 到 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[i][i] = 1,因为一个字符本身就是回文串。

最终的答案为 dp[0][n-1],其中 n 是字符串的长度。

时间复杂度为 O(n^2)。

参考代码
def longest_palindromic_subsequence(s):
    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]

t = int(input())
for _ in range(t):
    s = input().strip()
    ans = longest_palindromic_subsequence(s)
    print(ans)