📅  最后修改于: 2023-12-03 15:37:15.046000             🧑  作者: Mango
给定一个由字母组成的字符串,找出该字符串中存在的最长回文子序列的长度。
输入的第一行包含一个整数 T,表示测试用例的数量。接下来的 T 行包含一个字符串。
对于每个测试用例,输出该字符串中存在的最长回文子序列的长度。
2
ABBDCACB
GGGEEKS
5
5
最长回文子序列是一道经典问题,可以使用动态规划求解。设 dp[i][j] 表示字符串从 i 到 j 之间最长回文子序列的长度,状态转移方程如下:
初始化 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)