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

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

国际空间研究组织 | ISRO CS 2020 |问题 41

问题描述

给定一个字符串S,找到S中最长的回文子序列的长度。字符串S可能包含大小写字母、数字和符号字符。

函数签名
def longest_palindromic_subsequence(s: str) -> int:
    pass
示例
assert longest_palindromic_subsequence("bbbab") == 4
assert longest_palindromic_subsequence("cbbd") == 2
解题思路

最长回文子序列是一种经典的动态规划问题。具体来说,我们可以使用一个二维数组dp来记录从ij的子序列中,最长回文子序列的长度。那么,当i==j时,最长回文子序列的长度为1;当i<j时,如果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])。最后,返回dp[0][-1]即可。

代码实现
def longest_palindromic_subsequence(s: str) -> int:
    n = len(s)
    # 初始化dp数组
    dp = [[0] * n for _ in range(n)]
    for i in range(n):
        dp[i][i] = 1  # 初始化对角线的值为1
    # 填充dp数组
    for gap in range(1, n):
        for i in range(n-gap):
            j = i + gap
            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][-1]