当前位置:   article > 正文

LeetCode 516. 最长回文子序列

LeetCode 516. 最长回文子序列

1.题目

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

子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列。

示例 1:

输入:s = "bbbab"
输出:4
解释:一个可能的最长回文子序列为 "bbbb" 。

示例 2:

输入:s = "cbbd"
输出:2
解释:一个可能的最长回文子序列为 "bb" 。

提示:

    1 <= s.length <= 1000
    s 仅由小写英文字母组成

来源:力扣(LeetCode)

 2.代码及思路

  1. class Solution:
  2. def longestPalindromeSubseq(self, s: str) -> int:
  3. size = len(s)
  4. '''dp[i][k]表示下标[i, k](闭区间)子字符串中的最大回文长度'''
  5. dp = [[1] * size for _ in range(size)]
  6. for i in range(size - 1, -1, -1):
  7. for k in range(i, size):
  8. '''当字符串两端相等,最大长度为中间部分的最大长度加2'''
  9. if s[i] == s[k]:
  10. if k - i == 0:
  11. dp[i][k] = 1
  12. elif k - i == 1:
  13. dp[i][k] = 2
  14. else:
  15. dp[i][k] = dp[i + 1][k - 1] + 2
  16. '''
  17. 当两端不相等,最大长度有两种情况:
  18. 1.删最左边的,dp[i + 1][k]已经计算好了
  19. 2.删最右边的,dp[i][k - 1]也已经计算好了
  20. 至于删两边的情况已经包含在1,2中了
  21. '''
  22. else:
  23. dp[i][k] = max(dp[i][k - 1], dp[i + 1][k])
  24. return dp[0][-1]

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/590382
推荐阅读
相关标签
  

闽ICP备14008679号