📜  门| GATE-CS-2017(套装2)|第 48 题(1)

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

题目描述

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

输入格式:

  • 第一行:N(测试用例个数)
  • 接下来N行:每行输入一个字符串S

输出格式:

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

本题可以使用动态规划的思路来解决,具体方法如下:

  • 定义状态:dp[i][j]表示区间[i,j]中的最长回文子序列的长度
  • 初始化:dp[i][i] = 1
  • 状态转移方程:如果S[i] == S[j],则dp[i][j] = dp[i+1][j-1]+2,否则dp[i][j] = max(dp[i+1][j], dp[i][j-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 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]

注:Python代码中的"_":int表示这个变量暂时不会用到,"_"是Python中表示占位的特殊字符。