题目

力扣原题链接:最长回文子序列

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

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

示例 1:

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

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

提示:

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

package com.harrison.class12;/*** @author Harrison* @create 2022-03-22-12:54* @motto 众里寻他千百度,蓦然回首,那人却在灯火阑珊处。*/
public class Code11_LongestPalindromeSubsequence {public static int lsp1(String s) {if (s == null || s.length() == 0) {return 0;}char[] str = s.toCharArray();return process1(str, 0, str.length - 1);}/*str[L...R]最长回文子序列长度返回1) 最长回文子序列既不以str[L]开始,也不以str[R]结尾 比如:a12321b -> 123212) 以str[L]开头,不以str[R]结尾 比如:12a321b -> 123213) 不以str[L]开头,以str[R]结尾 比如:a123b321 -> 123214) 既以str[L]开始,也以str[R]结尾 比如:1ab23cd21 -> 12321*/public static int process1(char[] str, int L, int R) {// 如果只有一个字符,那就是回文if (L == R) {return 1;}// 如果有两个字符,相等就是回文,长度是2;不相等,回文长度就是1if (L == R - 1) {return str[L] == str[R] ? 2 : 1;}// 接下来依次就是上述四种情况int p1 = process1(str, L + 1, R - 1);int p2 = process1(str, L, R - 1);int p3 = process1(str, L + 1, R);// 第四种情况前提条件:str[L]==str[R]int p4 = str[L] == str[R] ? (2 + process1(str, L + 1, R - 1)) : 0;return Math.max(Math.max(p1, p2), Math.max(p3, p4));}// L:0~N-1// R:0~N-1public static int lsp2(String s) {if (s == null || s.length() == 0) {return 0;}char[] str = s.toCharArray();int N = str.length;int[][] dp = new int[N][N];// 先单独把最右下角的值填好,因为最右下角的右边没有格子了// 然后填中间的对角线和倒数第二条对角线dp[N - 1][N - 1] = 1;// 保证不越界,因为两条对角线是一起填的for (int i = 0; i < N - 1; i++) {dp[i][i] = 1;dp[i][i + 1] = str[i] == str[i + 1] ? 2 : 1;}// 剩余普遍位置的填法:// 每一行:从下往上// 每一列,从左往右for (int L = N - 3; L >= 0; L--) {for (int R = L + 2; R < N; R++) {int p1 = dp[L + 1][R - 1];int p2 = dp[L][R - 1];int p3 = dp[L + 1][R];int p4 = str[L] == str[R] ? (2 + dp[L + 1][R - 1]) : 0;dp[L][R] = Math.max(Math.max(p1, p2), Math.max(p3, p4));}}return dp[0][N-1];}/*根据上面的推导,知道任何一个普遍位置都依赖三个位置的值,左,下,与左下,并且不可能比这三个值小,因为是所有可能性中求最大!!!所以左下可以忽略,为什么?(看最后截图)*/public static int lsp3(String s) {if (s == null || s.length() == 0) {return 0;}char[] str = s.toCharArray();int N = str.length;int[][] dp = new int[N][N];dp[N - 1][N - 1] = 1;for (int i = 0; i < N - 1; i++) {dp[i][i] = 1;dp[i][i + 1] = str[i] == str[i + 1] ? 2 : 1;}for (int L = N - 3; L >= 0; L--) {for (int R = L + 2; R < N; R++) {// 先将可能性2和可能性3进行PKdp[L][R]=Math.max(dp[L][R-1],dp[L+1][R]);// 如果右可能性4,再跟可能性4PKif(str[L]==str[R]){dp[L][R]=Math.max(dp[L][R],2+dp[L+1][R-1]);}}}return dp[0][N-1];}public static void main(String[] args) {String test="a12bc32d1f";System.out.println(lsp1(test));System.out.println(lsp2(test));System.out.println(lsp3(test));}
}


为什么可以省略掉左下这个位置的格子?

动态规划练习——最长回文子序列相关推荐

  1. 【leetcode】【动态规划】最长回文子序列

    [leetcode]最长回文子序列 题目 代码 leetcode题目地址 题目 给你一个字符串 s ,找出其中最长的回文子序列,并返回该序列的长度. 子序列定义为:不改变剩余字符顺序的情况下,删除某些 ...

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

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

  3. 算法62---最长回文子序列长度(子串)、回文子序列总共个数(子串)【动态规划】...

    参考链接:https://www.cnblogs.com/AndyJee/p/4465696.html 一.题目:最长回文子序列长度 给定字符串,求它的最长回文子序列长度.回文子序列反转字符顺序后仍然 ...

  4. 动态规划求一个序列的最长回文子序列(Longest Palindromic Substring )

    1.问题描述 给定一个字符串(序列),求该序列的最长的回文子序列. 2.分析 需要理解的几个概念: ---回文 ---子序列 ---子串 http://www.cnblogs.com/LCCRNblo ...

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

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

  6. 【1错笔记】psd面试——最长回文子序列 动态规划(2000字超详细解题)

    题目: 链接:https://ac.nowcoder.com/acm/contest/90/D 来源:牛客网 题目描述 掌握未来命运的女神 psd 师兄在拿了朝田诗乃的 buff 后决定去实习. 埃森 ...

  7. 动态规划:最长回文子串 最长回文子序列

    一.题目 所谓回文字符串,就是一个字符串,从左到右读和从右到左读是完全一样的,比如 "a"."aba"."abba". 对于一个字符串,其子 ...

  8. 最长回文子序列题解 递归+动态规划

    从直接递归入手改为动态规划(官方的动态转移方程答案看不懂) 当某个字符串是回文序列时,考虑其内部字符串是否还是回文序列,可以看到每次遍历时的步骤是一致的,可以通过递归的方式求解 直接递归求解(此代码题 ...

  9. java最长回文子序列_LeetCode[5] - 最长回文子串动态规划

    题目 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为1000. 示例 1: 输入: "babad" 输出: "bab" 注意: & ...

最新文章

  1. mxnet中symbol的网络结构输出(参数维度,和每层输出维度)
  2. 在桌面上创建一个宽带连接服务器,win7宽带连接怎么创建桌面
  3. UVA-10714 Ants---蚂蚁模拟
  4. html5 接收蓝牙广播_蓝牙定位技术浅析(化工厂应用)
  5. orm查询部分字段_ORM问题第2部分–查询
  6. 英语名词复数的一般构成方法以及读音规则
  7. 贝叶斯参数估计的理解及其在电商算法中的应用
  8. sql server分页_SQL Server中的分页
  9. 中国四丁基尿素(TBU)市场趋势报告、技术动态创新及市场预测
  10. Linux中的两个经典宏定义
  11. 一看就懂ReactJS
  12. JSP标签JSTL(3)--迭代操作
  13. 数据库特点分析| 寻找你心中的数据库漫威英雄
  14. 2018年 数据挖掘“泰迪杯” C题 第一问
  15. GetShell的姿势总结
  16. Jasmine中describe和it
  17. Navicat运行sql文件处理失败[ERR] 2006 - MySQL server has gone away解决
  18. 单行、多行 注释.HTML
  19. 2 路 FULL Cameralink 视觉检测 BOX
  20. Hinton努力推翻自己积累了30年的学术成果,我才知道什么叫生命力!

热门文章

  1. 为什么00后都不知道什么是报销?
  2. 英语学渣如何成功逆袭?聊聊我获得海外工作的真实经历
  3. 前端剑法第五式————平乱
  4. 账外“公对私”结算薪资有风险,灵活用工助力企业税务合规
  5. Python练习二:公用电话数据加密
  6. 64位win7搭建php mysql_[转]Win7 64位操作系统下配置PHP+MySql+Apache环境
  7. powerpoint转换器_将PowerPoint 2010演示文稿转换为视频
  8. 489-剖析SGI STL空间配置器
  9. 全球速卖通专业美容仪器封闭定向招商公告
  10. 安卓逆向(一)课程大纲及说明