【leetcode】【动态规划】最长回文子序列
【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】【动态规划】最长回文子序列相关推荐
- LeetCode 516. 最长回文子序列(动态规划)
1. 题目 给定一个字符串s,找到其中最长的回文子序列.可以假设s的最大长度为1000. 示例 1: 输入: "bbbab" 输出: 4 一个可能的最长回文子序列为 "b ...
- 120. Leetcode 516. 最长回文子序列 (动态规划-子序列问题)
步骤一.确定状态: 确定dp数组及下标含义 dp[i][j]表示的是字符串s在[i, j]范围内最长的回文子序列的长度为dp[i][j] 步骤二.推断状态方程: 如果当前的s[i] == s[j], ...
- 动态数组怎么定义_动态规划最长回文子序列
动态规划|最长回文子序列 今天一起来学习Leetcode第 516 题:最长回文子序列. 题目描述 题目分析 首先回文字符串指的是形如"a","aa",''ab ...
- Leetcode 516.最长回文子序列
Time: 20190906 Type: Medium 题目描述 给定一个字符串s,找到其中最长的回文子序列.可以假设s的最大长度为1000. 示例 1: 输入: "bbbab" ...
- leetcode - 516. 最长回文子序列
516. 最长回文子序列 -------------------------------------------- 给定一个字符串s,找到其中最长的回文子序列.可以假设s的最大长度为1000. 示例 ...
- Java实现 LeetCode 516 最长回文子序列
516. 最长回文子序列 给定一个字符串s,找到其中最长的回文子序列.可以假设s的最大长度为1000. 示例 1: 输入: "bbbab" 输出: 4 一个可能的最长回文子序列为 ...
- LeetCode.516 最长回文子序列 详解
题目详情 给定一个字符串s,找到其中最长的回文子序列.可以假设s的最大长度为1000. 示例 1: 输入: "bbbab" 输出: 4 一个可能的最长回文子序列为 "bb ...
- 动态规划——最长回文子序列
题目简略如下: 给出一个字符串s,求s中的最长回文子序列的长度. 例如:在absbzaz中,最长的回文子序列就是absba,长度为5 如上图所示:此时的dp数组应该分情况讨论了: 最简单的一种情况:当 ...
- LeetCode 516. 最长回文子序列
截止到目前我已经写了 500多道算法题,其中部分已经整理成了pdf文档,目前总共有1000多页(并且还会不断的增加),大家可以免费下载 下载链接:https://pan.baidu.com/s/1hj ...
最新文章
- 服务器温控系统,服务器温度监控
- Qt Creator调试
- 激光slam_机器人主流定位技术,激光SLAM与视觉SLAM谁更胜一筹
- PyCharm常用快捷键和设置
- VBNET学习笔记---MS VBnet数据库访问技术,概念,介绍,发展历程.
- python模型训练框架_Pytorch-Transformers 1.0发布,支持六个预训练框架,含27个预训练模型...
- hadoop面试题汇总
- JAVA学习DAY3 - 循环 输出平行四边形,等腰三角形,菱形
- 从零开始做运营 进阶篇
- 周四007欧联杯 佛罗伦萨 VS 门兴[11]
- MATLAB数字图像示例题目
- 第三方支付订单修改金额的踩坑经历
- 商丘学院计算机考研,商丘学院院校简介_商丘学院研究生院 - 中国考研网
- Arduino基础项目十四:红外对管模块
- Java实现QQ邮件发送
- 网络标准(从一类线到八类线)
- ssm博客系统-博主登陆功能实现(shiro支持)
- 【Shell系列】$(shell pwd)和$(pwd)用法区别
- 【字符集】字符集和编码知识【转】
- 重装系统 linux u盘启动不了怎么办,用U盘启动盘重装系统启动时黑屏