📜  门|门 IT 2007 |第 75 题(1)

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

门|门 IT 2007 |第 75 题

这是门|门 IT 2007年的第75题,是一道经典的编程题目。

题目描述

给定一个字符串 S,找出其中最长的回文子序列,并返回其长度。

例如,给定 S = "babad",最长的回文子序列为 "bab" 或 "aba",长度为 3。

解题思路

本题可以使用动态规划算法来解决。

首先定义一个二维数组 dp,其中 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] 时,说明 S[i] 和 S[j] 不可能同时出现在同一个回文子序列中,此时有 dp[i][j] = max(dp[i + 1][j], dp[i][j - 1])。

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

代码实现
class Solution:
    def longestPalindromeSubseq(self, 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]
总结

本题是一道比较典型的动态规划题目,需要使用二维数组来记录状态,同时需要注意区分子序列和子串的概念。此外,还需要注意边界条件的处理。