【LeetCode】最长回文子序列

先上代码:

代码

#coding=utf-8
# 本题为考试单行多行输入输出规范示例,无需提交,不计分。
def solve():
    s = input()
    leng = len(s)
    
    dp = [[0 for i in range(leng)]  for i in range(leng)] 
    # print(dp)
    for i in reversed(range(leng)):
        dp[i][i] = 1
        for j in range(i+1,leng):
            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][leng-1]
res = solve()
print(res)

题目比较简单,但是得保持题感才行。这是今天喜马拉雅的笔试中的编程题(搜索推荐算法)。

思想

dp[i][j] 表示为从i到j的序列的最长回文子序列,需要注意一下遍历的方向是从后往前,也就是如下矩阵的上三角部分:
在这里插入图片描述
如果对于一个长度为5的字符串,那么遍历的区间就是 [5,5] => [4,5] => [3,5]… => [0,5]
递推公式比较简单,参考代码即可。

おすすめ

転載: blog.csdn.net/liu16659/article/details/127481418