最长回文子序列---DP
问题描述
给定一个字符串s,找到其中最长的回文子序列。可以假设s的最大长度为1000。
解题思路
1.说明
首先要弄清楚回文子串和回文子序列的区别,如果一个字符串是“bbbab”,那么它的回文子串为“bbb”,但是其回文子序列是“bbbb”,这是因为回文子序列中可以相隔字符,不一定要连续。
2.思路
定义dp数组的含义。这里我们定义一个二维数组dp
dp[i][j]表示字符串str从i到j的字符串中最长回文子序列的长度。
假设我们现在已经知道dp[i+1][j-1]的值,那么dp[i][j]的值只需要判断s[i]和s[j]是否相等即可。
如果s[i]=s[j],那么dp[i][j]=dp[i+1][j-1]+2,直接加2即可。
如果s[i]!=s[j],说明s[i]和s[j]至少是不在这个回文序列的,表明这时的dp[i][j]只需取两者之间的最大值即可,那么dp[i][j]=Max(dp[i][j-1],dp[i+1][j])。
3. 举例说明
例如字符串“bbbab”,在创建数组之前,可以先将如下矩阵的部分内容填好,因为dp[i][i]一个字符即可构成一个回文序列,所以有dp[i][i]=1。同时,dp[i][j](i>j)=0;即不存在。
然后可以从下往上来计算。
| i\j | 0 | 1 | 2 | 3 | 4 |
| 0 | 1 | 2 | 2 | 2 | 4 |
| 1 | 0 | 1 | 2 | 2 | 3 |
| 2 | 0 | 0 | 1 | 1 | 3 |
| 3 | 0 | 0 | 0 | 1 | 1 |
| 4 | 0 | 0 | 0 | 0 | 1 |
填满表格最后的一个数即为回文子序列最长的长度。返回dp[o][4]即可。
3. 代码
int longestPalindromeSubseq(char * s){
int N=strlen(s);
int dp[N][N]; //dp[i][j]表示从i到j回文子序列的长度
for(int i=0;i<N;++i){
for(int j=0;j<N;++j){
if(i==j) dp[i][j]=1;
else dp[i][j]=0;
}
}
for(int i=N-1;i>=0;--i){
for(int j=i+1;j<N;++j){
if(s[i]==s[j]) dp[i][j]=dp[i+1][j-1]+2;
else dp[i][j]=fmax(dp[i][j-1],dp[i+1][j]);
}
}
return dp[0][N-1];
}
最长回文子序列---DP的更多相关文章
- HDU 4745 Two Rabbits ★(最长回文子序列:区间DP)
题意 在一个圆环串中找一个最长的子序列,并且这个子序列是轴对称的. 思路 从对称轴上一点出发,向两个方向运动可以正好满足题意,并且可以证明如果抽选择的子环不是对称的话,其一定不是最长的. 倍长原序列, ...
- 最长回文子序列/最长回文子串(DP,马拉车)
字符子串和字符子序列的区别 字符字串指的是字符串中连续的n个字符:如palindrome中,pa,alind,drome等都属于它的字串 而字符子序列指的是字符串中不一定连续但先后顺序一致的n个字符: ...
- [LeetCode] Longest Palindromic Subsequence 最长回文子序列
Given a string s, find the longest palindromic subsequence's length in s. You may assume that the ma ...
- [Swift]LeetCode516. 最长回文子序列 | Longest Palindromic Subsequence
Given a string s, find the longest palindromic subsequence's length in s. You may assume that the ma ...
- Leetcode 516.最长回文子序列
最长回文子序列 给定一个字符串s,找到其中最长的回文子序列.可以假设s的最大长度为1000. 示例 1:输入: "bbbab" 输出: 4 一个可能的最长回文子序列为 " ...
- 简单动态规划——最长公共子序列&&最长回文子序列&&最长上升||下降子序列
最长公共子序列,顾名思义当然是求两个字符串的最长公共子序列啦,当然,这只是一道非常菜的动规,所以直接附上代码: #include<iostream> #include<cstdio& ...
- [LeetCode] 516. Longest Palindromic Subsequence 最长回文子序列
Given a string s, find the longest palindromic subsequence's length in s. You may assume that the ma ...
- 最长回文子序列LCS,最长递增子序列LIS及相互联系
最长公共子序列LCS Lintcode 77. 最长公共子序列 LCS问题是求两个字符串的最长公共子序列 \[ dp[i][j] = \left\{\begin{matrix} & max(d ...
- LPS(最长回文子序列)
(注意:我发现最长回文子序列(Longest Palindromic Subsequence)问题与最长回文子串(Longest Palindromic Substring)不一样,子序列不要求下标一 ...
随机推荐
- win10家庭版无法访问samba
1:本教程只针对win10家庭版用户,右键点击电脑选择属性就能看到自己的版本.(因为win10家庭版没有本地策略组) 2:针对一下连接不上的情况 3:连接不上的情况 ① : ...
- 公有组件ShowCodeList实现原理之一一下拉框的实现
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 深度掌握 Java Stream 流操作,让你的代码高出一个逼格!
概念 Stream将要处理的元素集合看作一种流,在流的过程中,借助Stream API对流中的元素进行操作,比如:筛选.排序.聚合等. Stream 的操作符大体上分为两种:中间操作符和终止操作符 中 ...
- 如何用js得到当前页面的url信息方法
设置或获取对象指定的文件名或路径. alert(window.location.pathname) 设置或获取整个 URL 为字符串. alert(window.location.href); 设置或 ...
- DC-5靶机
仅供个人娱乐 靶机信息 下载地址:http://www.five86.com/downloads/DC-5.zip 一.主机扫描 arp-scan -l nmap -p 1-65535 -A -sV ...
- 解决 Flask 项目无法用 .env 文件中解析的参数设置环境变量的错误
在 Windows 上启动 Flask 项目时,工作目录有 UTF-8 编码的 .env 文件,里面配置的环境变量在 Python2 中识别为 Unicode 类型,导致下述错误: * Serving ...
- noip模拟32[好数学啊]
noip模拟32 solutions 真是无语子,又没上100,无奈死了 虽然我每次都觉得题很难,但是还是有好多上100的 战神都200多了,好生气啊啊啊 从题开始变难之后,我的时间分配越来越不均匀, ...
- [考试总结]noip模拟33
连炸两场... 伤心... 第一个题目首先因为有期望坐镇,然后跳过... 然后第二个题目发现题目挺绕的,然后转化了一句话题意,然后..... \(\huge{\text{转化错了!!!!}}\) 然而 ...
- silky微服务简介
代理主机 silky微服务定义了三种类型的代理主机,开发者可以根据需要选择合适的silky代理主机托管微服务应用.代理主机定义了一个Startup模块,该模块给出了使用该种类型主机所必须依赖的模块. ...
- Java自定义注解使用和详解
前言 我们在做开发springboot 项目时候会遇到各种各样注解,使用各种各样注解,极大的简便了我们开发流程,方式,从JDK5开始支持 注解是Java语言的一种强大的功能 可以理解为代码上的特殊标记 ...