【leetcode】最长回文子序列

  • 题目
  • 代码

leetcode题目地址

题目

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

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

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

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

代码

动态规划算法。初始化n⋅nn\cdot nn⋅n大小的dpdpdp数组,dp[i][j]dp[i][j]dp[i][j]表示字符串iii到jjj内的最长回文字序列的长度。转移方程为:

dp[i][j]={dp[i+1][j−1]+2,str[i]==str[j]max(dp[i+1][j],dp[i][j−1]),otherwisedp[i][j]= \left\{\begin{matrix} & dp[i+1][j-1]+2 & ,str[i]==str[j]\\ & max(dp[i+1][j], dp[i][j-1]) & ,otherwise \end{matrix}\right. dp[i][j]={​dp[i+1][j−1]+2max(dp[i+1][j],dp[i][j−1])​,str[i]==str[j],otherwise​

再注意当i==ji==ji==j和i+1==ji+1==ji+1==j的情形即可。

自己写的屑代码:

class Solution {public:int longestPalindromeSubseq(string s) {int n = s.size();vector<vector<int>> arr(n, vector<int>(n));for(int i=0;i<n;i++) arr[i][i] = 1;for(int i=0;i<n-1;i++) arr[i][i+1] = s[i] == s[i+1] ? 2 : 1;for(int k=1;k<n;k++){for(int i=0;i<n-k;i++){arr[i][i+k] = max(arr[i][i+k-1], arr[i+1][i+k]);if(s[i] == s[i+k]) arr[i][i+k] = max(arr[i][i+k], arr[i+1][i+k-1] + 2);}}return arr[0][n-1];}
};

为什么想写一下呢,主要是最近正活儿干的太慢。。。啊不,是在上面的代码中想着循环的层次顺序的问题,遍历的要点我认为是保证其依赖的子区间全部都计算过了,最简单的思路就是如以上代码,先遍历区间的长度k(k=j−i)k(k=j-i)k(k=j−i),再遍历区间的起始点iii,这样最易于理解,而遍历iii、jjj在脑子不清楚(比如写代码的时候)就会自我怀疑,它这个子区间都处理了吗?(类似于“我今天出门锁门了吗?”)。下面用excel简单画了个图看一下——我也是闲的。。。


要点说过了,在于保证当前区间的真子区间(就是不包括自己,我随便编的概念)都已经处理过了,我的代码为左图,下面的官方代码为中间图。

官方代码:

class Solution {public:int longestPalindromeSubseq(string s) {int n = s.length();vector<vector<int>> dp(n, vector<int>(n));for (int i = n - 1; i >= 0; i--) {dp[i][i] = 1;char c1 = s[i];for (int j = i + 1; j < n; j++) {char c2 = s[j];if (c1 == c2) {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];}
};

【leetcode】【动态规划】最长回文子序列相关推荐

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

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

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

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

  3. 动态数组怎么定义_动态规划最长回文子序列

    动态规划|最长回文子序列 今天一起来学习Leetcode第 516 题:最长回文子序列. 题目描述 题目分析 首先回文字符串指的是形如"a","aa",''ab ...

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

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

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

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

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

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

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

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

  8. 动态规划——最长回文子序列

    题目简略如下: 给出一个字符串s,求s中的最长回文子序列的长度. 例如:在absbzaz中,最长的回文子序列就是absba,长度为5 如上图所示:此时的dp数组应该分情况讨论了: 最简单的一种情况:当 ...

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

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

最新文章

  1. 服务器温控系统,服务器温度监控
  2. Qt Creator调试
  3. 激光slam_机器人主流定位技术,激光SLAM与视觉SLAM谁更胜一筹
  4. PyCharm常用快捷键和设置
  5. VBNET学习笔记---MS VBnet数据库访问技术,概念,介绍,发展历程.
  6. python模型训练框架_Pytorch-Transformers 1.0发布,支持六个预训练框架,含27个预训练模型...
  7. hadoop面试题汇总
  8. JAVA学习DAY3 - 循环 输出平行四边形,等腰三角形,菱形
  9. 从零开始做运营 进阶篇
  10. 周四007欧联杯 佛罗伦萨 VS 门兴[11]
  11. MATLAB数字图像示例题目
  12. 第三方支付订单修改金额的踩坑经历
  13. 商丘学院计算机考研,商丘学院院校简介_商丘学院研究生院 - 中国考研网
  14. Arduino基础项目十四:红外对管模块
  15. Java实现QQ邮件发送
  16. 网络标准(从一类线到八类线)
  17. ssm博客系统-博主登陆功能实现(shiro支持)
  18. 【Shell系列】$(shell pwd)和$(pwd)用法区别
  19. 【字符集】字符集和编码知识【转】
  20. 重装系统 linux u盘启动不了怎么办,用U盘启动盘重装系统启动时黑屏

热门文章

  1. oracle or 运算,Oracle Or子句
  2. Python 之详解深拷贝和浅拷贝
  3. 输入6个学生的5门成绩c语言数组,C语言数组指针的小例子.pdf
  4. oracle 执行sql路径,如何指定 SQL 执行路径
  5. java 取上下文路径_取得上下文路径的方式(getContextPath)
  6. python不等于缺陷
  7. python字符串转义表
  8. php遗漏,PHP被遗漏的执行函数
  9. 畅通工程再续 最小生成树
  10. 30个常用python实现