516. 最长回文子序列

  • 题目描述
  • 解题思路:动态规划

题目描述

给你一个字符串 s ,找出其中最长的回文子序列,并返回该序列的长度。子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列

来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/longest-palindromic-subsequence
示例1

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

示例2

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

提示

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

解题思路:动态规划

本题使用动态规划求解。对于一个子序列,如果它是回文子序列,并且长度大于2,那么将它首尾的两个字符去掉之后,它仍然是一个回文子序列。因此可以使用动态规划的方法计算给定字符串的最长回文子序列。

使用dp[i][j]dp[i][j]dp[i][j]表示字符串s的下标范围[i,j][i,j][i,j]内的最长回文子序列的长度。假设字符串s的长度为n,则只有当0<=i<=j<n0<=i<=j<n0<=i<=j<n时,才会有dp[i][j]>0dp[i][j]>0dp[i][j]>0,否则dp[i][j]=0dp[i][j] = 0dp[i][j]=0。

由于任何长度为1的子序列都是回文子序列,因此在动态规划遍历中,边界情况是对于任意0<=i<n0<=i<n0<=i<n,都有dp[i][i]=1dp[i][i] = 1dp[i][i]=1。

当i<ji<ji<j时,计算dp[i][j]dp[i][j]dp[i][j]需要分别考虑字符串两端s[i]s[i]s[i]和s[j]s[j]s[j]相等和不相等的情况:

  • 如果s[i]=s[j]s[i]=s[j]s[i]=s[j],则首先得到s的下标范围[i+1,j−1][i+1, j-1][i+1,j−1]内的最长回文子序列,然后在该子序列的首尾分别添加s[i]s[i]s[i]和s[j]s[j]s[j],即可得到s的下表范围[i,j][i, j][i,j]内的最长回文子序列,因此有:dp[i][j]=dp[i+1][j−1]+2dp[i][j] = dp[i+1][j-1] + 2dp[i][j]=dp[i+1][j−1]+2;
  • 如果s[i]≠s[j]s[i] \not = s[j]s[i]​=s[j],则表明s[i]s[i]s[i]和s[j]s[j]s[j]不可能同时作为同一个回文子序列的首尾,因此当前的dp[i][j]dp[i][j]dp[i][j]取分别添加两端所能表示的最长回文子序列的最大值,即dp[i][j]=max(dp[i+1][j],dp[i][j−1])dp[i][j] = max(dp[i+1][j], dp[i][j-1])dp[i][j]=max(dp[i+1][j],dp[i][j−1])。

由于状态转移方程都是从长度较短的子序列向长度较长的子序列转移,因此需要注意动态规划的循环顺序。从状态转移方程来看,在计算dp[i][j]dp[i][j]dp[i][j]的时候,需要用到dp[i+1][j−1]dp[i+1][j-1]dp[i+1][j−1]和dp[i+1][j]dp[i+1][j]dp[i+1][j],因此对于i的遍历应该从后向前,对于j的遍历应该从前往后。最终返回dp[0][s.length−1]dp[0][s.length-1]dp[0][s.length−1],即为答案。

代码如下

class Solution:def longestPalindromeSubseq(self, s: str) -> int:n = len(s)dp = [[0] * n for _ in range(n)]for i in range(n-1,-1,-1):dp[i][i] = 1for j in range(i+1, n):if s[i]==s[j]:dp[i][j] = dp[i+1][j-1]+2else:dp[i][j] = max(dp[i+1][j], dp[i][j-1])return dp[0][n-1]

复杂度分析

  • 时间复杂度:O(n2)O(n^2)O(n2),其中 n 是字符串 s 的长度。动态规划需要计算的状态数是 O(n2)O(n^2)O(n2)。
  • 空间复杂度:O(n2)O(n^2)O(n2),其中 n 是字符串 s 的长度。需要创建二维数组 dp\textit{dp}dp,所需空间是 O(n2)O(n^2)O(n2)。

【Leetcode】516. 最长回文子序列相关推荐

  1. leetcode - 516. 最长回文子序列

    516. 最长回文子序列 -------------------------------------------- 给定一个字符串s,找到其中最长的回文子序列.可以假设s的最大长度为1000. 示例 ...

  2. Java实现 LeetCode 516 最长回文子序列

    516. 最长回文子序列 给定一个字符串s,找到其中最长的回文子序列.可以假设s的最大长度为1000. 示例 1: 输入: "bbbab" 输出: 4 一个可能的最长回文子序列为 ...

  3. LeetCode 516. 最长回文子序列(动态规划)

    1. 题目 给定一个字符串s,找到其中最长的回文子序列.可以假设s的最大长度为1000. 示例 1: 输入: "bbbab" 输出: 4 一个可能的最长回文子序列为 "b ...

  4. Leetcode 516.最长回文子序列

    Time: 20190906 Type: Medium 题目描述 给定一个字符串s,找到其中最长的回文子序列.可以假设s的最大长度为1000. 示例 1: 输入: "bbbab" ...

  5. 120. Leetcode 516. 最长回文子序列 (动态规划-子序列问题)

    步骤一.确定状态: 确定dp数组及下标含义 dp[i][j]表示的是字符串s在[i, j]范围内最长的回文子序列的长度为dp[i][j] 步骤二.推断状态方程: 如果当前的s[i] == s[j], ...

  6. LeetCode.516 最长回文子序列 详解

    题目详情 给定一个字符串s,找到其中最长的回文子序列.可以假设s的最大长度为1000. 示例 1: 输入: "bbbab" 输出: 4 一个可能的最长回文子序列为 "bb ...

  7. LeetCode 516. 最长回文子序列

    截止到目前我已经写了 500多道算法题,其中部分已经整理成了pdf文档,目前总共有1000多页(并且还会不断的增加),大家可以免费下载 下载链接:https://pan.baidu.com/s/1hj ...

  8. 代码随想录补打卡 647 回文子串 516 最长回文子序列

    647 回文子串 代码如下 func countSubstrings(s string) int {    //dp[i][j]数组的含义是i-j这个范围的元素是否为回文串 dp := make([] ...

  9. 【Leetcode刷题Python】516. 最长回文子序列

    1 题目 给你一个字符串 s ,找出其中最长的回文子序列,并返回该序列的长度. 子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列. 示例 1: 输入:s = &q ...

最新文章

  1. 千万用户同时在线,优酷智能档在双11“猫晚”直播如何防卡顿?
  2. 江西理工大学计算机管理技术期末复习(wangzhendong)网络管理与维护
  3. (PASS)JAVA数组去重 三种方法 (不用集合)
  4. [云炬创业基础笔记]第九章企业的法律形态测试3
  5. python制作计算机程序_用 Python 开发实用程序 – 计算器
  6. 【OS学习笔记】二十 保护模式六:保户模式下操作系统内核如何加载用户程序并运行 对应的汇编代码之主引导扇区程序
  7. 第三章 使用属性升级MyBank
  8. 你担心大家会滥用的全局变量,大家(包括你自己)一定会滥用
  9. java配置文件强制更新_对Java配置文件Properties的读取、写入与更新操作
  10. 漂亮实用的loading(加载)封装
  11. 这几天可能是长时间关注电脑,眼睛没有得到休息,所以就早上起来眼睛有点通...
  12. 印第安纳大学计算机与信息学院,印第安纳大学伯明顿分校管理信息系统(MIS)专业详解...
  13. 华为手机长按图片无法下载
  14. Android Room的使用
  15. 电商移动Web实战项目(1)
  16. 【C语言编程--水仙花数II】
  17. Linux笔记1(安装,目录结构,远程登录,vi和vim,用户管理,实用指令。定时调度,挂载。)
  18. excel批量改名字(含识别区分)
  19. Hbase--Scan全局扫描中的过滤器
  20. STC15单片机-ADC获取环境温度(NTC热敏电阻)

热门文章

  1. 51单片机——定时器中断
  2. 史上最全的画册制作流程—画册类型
  3. 前端剑法第五式————平乱
  4. 将List转换为数组
  5. 区块链与会计行业结合将产生何种化学反应?
  6. gitee创建仓库以及远程连接
  7. android 自动播放 幻灯片,Android自动播放Banner图片轮播效果
  8. AX2012服务器配置--Windows Server 2012 如何实现多个用户远程桌面登陆?
  9. 科研资料|这才是毕业论文的正确打开方式!
  10. 2017-11-12立长志