leetcode 516. 最长回文子序列(JAVA)题解

题目链接https://leetcode.cn/problems/longest-palindromic-subsequence/description/?utm_source=LCUS&utm_medium=ip_redirect&utm_campaign=transfer2china

目录

题目描述:

暴力递归:

动态规划:


题目描述:

给你一个字符串 s ,找出其中最长的回文子序列,并返回该序列的长度。子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列。

示例 1:

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

示例 2:

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

提示:

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

这道题的知识点是动态规划,可是如果直接从动态规划讲可能有点不容易理解。

所以本篇文章就是从暴力递归到动态规划

从题目中我们可以得出:本题找的是可以不连续的回文子串然后返回其最大序列的长度。

也就是说:

a2b42a

的最长回文子序列为:a2b2a或a242a 这两个都可以因为它们返回的都是5

暴力递归:

我们先写一个可以返回最长的回文子序列长度的函数:

//主函数
public int longestPalindromeSubseq(String s) {char[] str = s.toCharArray();return maxString(str, 0, str.length-1);
}//假设该函数可以返回最长回文子序列的长度
public static int maxString(char[] str, int l, int r) {}

我们写的 maxString() 方法可以返回 str 字符串[l, r]区间的最长回文子序列的长度 。

通过分析可以得出以下结论:

两种特殊情况:

  • 首先我们可以得到当 l 和 r 相等就证明此时只有一个字符那么它的返回值就是 1
  • 如果传入的数组只有两个字符即 l + 1 == r 那么此时如果这两个字符相等就返回 2 ,如果不相等就返回 1

普遍情况:

  • 两边的字符不存在于最长的回文子序列中。例:a1221b    ->   1221;
  • 右边的字符不存在在于最长的回文子序列中。例:1221b    ->   1221;
  • 左边的字符不存在在于最长的回文子序列中。例:a1221    ->   1221;
  • 两边的字符存在于最长的回文子序列中。例:1w221    ->   1221。

 此时代码就可以这样写:

//主函数
public int longestPalindromeSubseq(String s) {char[] str = s.toCharArray();return maxString(str, 0, str.length-1);
}//假设该函数可以返回最长回文子序列的长度
public static int maxString(char[] str, int l, int r) {//先判断两种特殊情况if (l == r){return 1;}if (l + 1 == r){return str[l] == str[r] ? 2 : 1;}//余下的四种情况int a1 = maxString(str, l + 1, r - 1);int a2 = maxString(str, l, r - 1);int a3 = maxString(str, l + 1, r);int a4 = str[l] == str[r] ? 2 + maxString(str, l + 1, r - 1) : 0;//因为题目要求返回最长序列长度  所以需要返回这四个的最大值return Math.max(Math.max(a1, a2), Math.max(a3, a4));
}

 此时我们可以提交以下:

 虽然没通过但是从它的报错信息可以看出,我们的思路是没问题的。

动态规划:

我们有了递归版本后就可以根据它来写出动态规划版本了。

 因为在maxString() 方法中只有 l 和 r 是变量,而它们两个的取值范围都是 [0,str.length - 1] 

此时我们就可以通过创建一个二维数组将 l 和 r 所有情况都列举出来然后返回数组[0,str.length - 1] 下标的值就可以得出答案了。

我们先假设长度只有 5 ,那么我们就可以创建如下的二维数组 l 行,r 列

public static int maxString(char[] str, int l, int r) {int[][] arr = new int[str.length][str.length];}

 

接下来的填表阶段就可以根据递归函数直接填(以“a1221”为例子): 

 

 

此时 [0, 4] 位置的值就是最终答案。 

 根据每个位置的关系就将递归优化成:

public static int maxString(char[] str, int l, int r) {int[][] arr = new int[str.length][str.length];//因为不存在l < r的情况所以下三角的空间不用for (int i = 0; i < str.length; i++) {if (i == 0){//填第一条对角线int j = 0;while(j < str.length) {arr[j][j] = 1;j++;}}else if (i == 1) {//填第二条斜线int j = 1;while(j < str.length) {arr[j - 1][j] = (str[j - 1] == str[j]) ? 2 : 1;j++;}}else {//其他int j = i;int k = 0;while(j < str.length){int a1 = arr[k + 1][j - 1];int a2 = arr[k][j - 1];int a3 = arr[k + 1][j];int a4 = str[k] == str[j] ? 2 + arr[k + 1][j - 1] : 0;arr[k][j] = Math.max(Math.max(a1, a2), Math.max(a3, a4));j++;k++;}}}return arr[0][str.length-1];
}

此时再提交就过了。 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/36255.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python学习过程笔记:主模块(main) 异常处理 命令行参数解析 日志记录 socket模块 类的私有方法 字节字符串

文章目录 1.Python中的主程序2.Python中的异常处理3.Python中的命令行参数解析4.Python中的日志记录5.网络编程socket模块6.Python中的私有方法7.Python中的字节字符串 1.Python中的主程序 if __name__ __main__在Python中&#xff0c;if __name__ __main__ 是一个常见的代码…

百日筑基篇——python爬虫学习(一)

百日筑基篇——python爬虫学习&#xff08;一&#xff09; 文章目录 前言一、python爬虫介绍二、URL管理器三、所需基础模块的介绍1. requests2. BeautifulSoup1. HTML介绍2. 网页解析器 四、实操1. 代码展示2. 代码解释1. 将大文件划分为小的文件&#xff08;根据AA的ID数量划…

简单认识Zabbix监控系统及配置

文章目录 一、zabbix概述1、定义2、zabbix监控原理3、监控对象4、zabbix的3种架构&#xff08;1&#xff09; C/S架构&#xff08;2&#xff09;分布式架构&#xff1a;zabbix-proxy-client架构&#xff08;3&#xff09; master-node-client架构 5、zabbix监控模式 二、部署za…

项目实战 — 消息队列(8){网络通信设计①}

目录 一、自定义应用层协议 &#x1f345; 1、格式定义 &#x1f345; 2、准备工作 &#x1f384;定义请求和响应 &#x1f384; 定义BasicArguments &#x1f384; 定义BasicReturns &#x1f345; 2、创建参数类 &#x1f384; 交换机 &#x1f384; 队列 &#x1f38…

【网络】传输层——TCP(滑动窗口流量控制拥塞控制延迟应答捎带应答)

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《网络》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; 上篇文章对TCP可靠性机制讲解了一部分&#xff0c;这篇文章接着继续讲解。 &#x1f3a8;滑动窗口 在…

Springboot 实践(2)MyEclipse2019创建项目修改pom文件,加载springboot 及swagger-ui jar包

MyEclipse2019创建工程之后&#xff0c;需要添加Springboot启动函数、添加application.yml配置文件、修改pom文件添加项目使用的jar包。 添加Springboot启动函数 创建文件存储路径 &#xff08;1&#xff09;右键单击“src/main/java”文件夹&#xff0c;弹出对话框输入路径…

Android 简单的视频、图片压缩工具

首页需要压缩的工具包 1.Gradle implementation com.iceteck.silicompressorr:silicompressor:2.2.3 2.添加相关权限&#xff08;手机得动态申请权限&#xff09; <uses-permission android:name"android.permission.READ_EXTERNAL_STORAGE"/> <uses-p…

05 - 研究 .git 目录

查看所有文章链接&#xff1a;&#xff08;更新中&#xff09;GIT常用场景- 目录 文章目录 1. HEAD2. config3. refs4. objects 1. HEAD 2. config 3. refs 4. objects Git对象一共有三种&#xff1a;数据对象 blob、树对象 tree以及提交对象 commit&#xff0c;这些对象都被保…

Vue 目录结构 vite 项目

Vue3 项目常用的目录结构和每个文件的作用【通过 vite 创建的项目】 vite目录结构&#xff1a; dist // 打包后生成的文件目录 node_modules // 环境依赖 public // 公共资源目录 favicon.ico …

深入探析设计模式:工厂模式的三种姿态

深入探析设计模式&#xff1a;工厂模式的三种姿态 1. 简单工厂模式1.1 概念1.2 案例1.3 优缺点 2. 抽象工厂模式2.1 概念2.2 案例&#xff1a;跨品牌手机生产2.3 优缺点 3. 超级工厂模式3.1 概念3.2 案例&#xff1a;动物园游览3.3 优缺点 4. 总结 欢迎阅读本文&#xff0c;今天…

go入门实践四-go实现一个简单的tcp-socks5代理服务

文章目录 前言socks协议简介go实现一个简单的socks5代理运行与压测抓包验证 前言 SOCKS是一种网络传输协议&#xff0c;主要用于客户端与外网服务器之间通讯的中间传递。协议在应用层和传输层之间。 本文使用先了解socks协议。然后实现一个socks5的tcp代理服务端。最后&#…

英语词法——代词

代词是用来代替名词、起名词作用的短语、分句和句子的词。英语中代词根据其意义和作用可分为九类:人称代词、物主代词、反身代词、相互代词、指示代词、疑问代词、不定代词、关系代词和连接代词。 第一节 人称代词 一、人称代词的形式和用法 人称代词单数复数第一人称第二人…

【ARM 嵌入式 编译系列 4 -- GCC 编译属性 __read_mostly 详细介绍】

文章目录 __read_mostly 介绍__read_mostly 在 linux 中的使用.data.read_mostly 介绍 __read_mostly 介绍 __read_mostly 是一个在Linux内核编程中用到的宏定义&#xff0c;这是一个gcc编译器的属性&#xff0c;用于告诉编译器此变量主要用于读取&#xff0c;很少进行写入&am…

MYSQL中用字符串2022-07去匹配Date类型大于2022-07-01并小于2022-07-31

正文 需求上&#xff0c;是有个日期字符串&#xff0c;例如2022-07&#xff0c;代表着年月。数据库中表对于这个字段存的是年月日&#xff0c;例如&#xff1a;2022-07-15。 我希望的是&#xff1a;获取到2022-07-01到2022-07-31&#xff0c;之间的数据&#xff0c;条件是&…

21款美规奔驰GLS450更换中规高配主机,汉化操作更简单

很多平行进口的奔驰GLS都有这么一个问题&#xff0c;原车的地图在国内定位不了&#xff0c;语音交互功能也识别不了中文&#xff0c;原厂记录仪也减少了&#xff0c;使用起来也是很不方便的。 可以实现以下功能&#xff1a; ①中国地图 ②语音小助手&#xff08;你好&#xf…

【BASH】回顾与知识点梳理(二十六)

【BASH】回顾与知识点梳理 二十六 二十六. 二十一至二十五章知识点总结及练习26.1 总结26.2 模拟26.3 简答题 该系列目录 --> 【BASH】回顾与知识点梳理&#xff08;目录&#xff09; 二十六. 二十一至二十五章知识点总结及练习 26.1 总结 Linux 操作系统上面&#xff0c…

unittest单元测试

当你在编写测试用例时&#xff0c;可以使用Python内置的unittest模块来进行单元测试。下面是一个逐步指南&#xff0c;帮助你理解如何编写和运行基本的单元测试。 导入必要的模块&#xff1a; 首先&#xff0c;你需要导入unittest模块和需要测试的模块&#xff08;例如&#xf…

运维监控学习笔记8

在服务器端&#xff0c;我们添加了nginx-server的主机&#xff1a; 在解决Error问题的过程中&#xff0c;我还通过zabbix_get这个命令进行了测试&#xff0c;发现是没有的&#xff0c;后来确认是在web页面配置的过程中&#xff0c;我输错了密码。 yum install zabbix-getzabbi…

uniapp-原生地图截屏返回base64-进行画板编辑功能

一、场景 vue写uniapp打包安卓包&#xff0c;实现原生地图截屏&#xff08;andirod同事做的&#xff09;-画板编辑功能 实现效果&#xff1a; 二、逻辑步骤简略 1. 由 原生地图nvue部分&#xff0c;回调返回 地图截屏生成的base64 数据&#xff0c; 2. 通过 uni插件市场 im…

《图解HTTP》——HTTP协议详解

一、HTTP协议概述 HTTP是一个属于应用层的面向对象协议&#xff0c;由于其简捷、快速的方式&#xff0c;适用于分布式超媒体信息系统。它于1990年提出&#xff0c;经过几年的使用与发展&#xff0c;得到不断地完善和扩展。目前在WWW中使用的是HTTP/1.0的第六版&#xff0c;HTTP…