问题描述

给定一个字符串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  4
1 0 1  2  3
2 0 0 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的更多相关文章

  1. HDU 4745 Two Rabbits ★(最长回文子序列:区间DP)

    题意 在一个圆环串中找一个最长的子序列,并且这个子序列是轴对称的. 思路 从对称轴上一点出发,向两个方向运动可以正好满足题意,并且可以证明如果抽选择的子环不是对称的话,其一定不是最长的. 倍长原序列, ...

  2. 最长回文子序列/最长回文子串(DP,马拉车)

    字符子串和字符子序列的区别 字符字串指的是字符串中连续的n个字符:如palindrome中,pa,alind,drome等都属于它的字串 而字符子序列指的是字符串中不一定连续但先后顺序一致的n个字符: ...

  3. [LeetCode] Longest Palindromic Subsequence 最长回文子序列

    Given a string s, find the longest palindromic subsequence's length in s. You may assume that the ma ...

  4. [Swift]LeetCode516. 最长回文子序列 | Longest Palindromic Subsequence

    Given a string s, find the longest palindromic subsequence's length in s. You may assume that the ma ...

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

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

  6. 简单动态规划——最长公共子序列&&最长回文子序列&&最长上升||下降子序列

    最长公共子序列,顾名思义当然是求两个字符串的最长公共子序列啦,当然,这只是一道非常菜的动规,所以直接附上代码: #include<iostream> #include<cstdio& ...

  7. [LeetCode] 516. Longest Palindromic Subsequence 最长回文子序列

    Given a string s, find the longest palindromic subsequence's length in s. You may assume that the ma ...

  8. 最长回文子序列LCS,最长递增子序列LIS及相互联系

    最长公共子序列LCS Lintcode 77. 最长公共子序列 LCS问题是求两个字符串的最长公共子序列 \[ dp[i][j] = \left\{\begin{matrix} & max(d ...

  9. LPS(最长回文子序列)

    (注意:我发现最长回文子序列(Longest Palindromic Subsequence)问题与最长回文子串(Longest Palindromic Substring)不一样,子序列不要求下标一 ...

随机推荐

  1. win10家庭版无法访问samba

    1:本教程只针对win10家庭版用户,右键点击电脑选择属性就能看到自己的版本.(因为win10家庭版没有本地策略组) 2:针对一下连接不上的情况               3:连接不上的情况 ① : ...

  2. 公有组件ShowCodeList实现原理之一一下拉框的实现

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. 深度掌握 Java Stream 流操作,让你的代码高出一个逼格!

    概念 Stream将要处理的元素集合看作一种流,在流的过程中,借助Stream API对流中的元素进行操作,比如:筛选.排序.聚合等. Stream 的操作符大体上分为两种:中间操作符和终止操作符 中 ...

  4. 如何用js得到当前页面的url信息方法

    设置或获取对象指定的文件名或路径. alert(window.location.pathname) 设置或获取整个 URL 为字符串. alert(window.location.href); 设置或 ...

  5. DC-5靶机

    仅供个人娱乐 靶机信息 下载地址:http://www.five86.com/downloads/DC-5.zip 一.主机扫描 arp-scan -l nmap -p 1-65535 -A  -sV ...

  6. 解决 Flask 项目无法用 .env 文件中解析的参数设置环境变量的错误

    在 Windows 上启动 Flask 项目时,工作目录有 UTF-8 编码的 .env 文件,里面配置的环境变量在 Python2 中识别为 Unicode 类型,导致下述错误: * Serving ...

  7. noip模拟32[好数学啊]

    noip模拟32 solutions 真是无语子,又没上100,无奈死了 虽然我每次都觉得题很难,但是还是有好多上100的 战神都200多了,好生气啊啊啊 从题开始变难之后,我的时间分配越来越不均匀, ...

  8. [考试总结]noip模拟33

    连炸两场... 伤心... 第一个题目首先因为有期望坐镇,然后跳过... 然后第二个题目发现题目挺绕的,然后转化了一句话题意,然后..... \(\huge{\text{转化错了!!!!}}\) 然而 ...

  9. silky微服务简介

    代理主机 silky微服务定义了三种类型的代理主机,开发者可以根据需要选择合适的silky代理主机托管微服务应用.代理主机定义了一个Startup模块,该模块给出了使用该种类型主机所必须依赖的模块. ...

  10. Java自定义注解使用和详解

    前言 我们在做开发springboot 项目时候会遇到各种各样注解,使用各种各样注解,极大的简便了我们开发流程,方式,从JDK5开始支持 注解是Java语言的一种强大的功能 可以理解为代码上的特殊标记 ...