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 <= 1000s仅由小写英文字母组成
这道题的知识点是动态规划,可是如果直接从动态规划讲可能有点不容易理解。
所以本篇文章就是从暴力递归到动态规划。
从题目中我们可以得出:本题找的是可以不连续的回文子串然后返回其最大序列的长度。
也就是说:
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];
}
此时再提交就过了。

相关文章:
leetcode 516. 最长回文子序列(JAVA)题解
题目链接https://leetcode.cn/problems/longest-palindromic-subsequence/description/?utm_sourceLCUS&utm_mediumip_redirect&utm_campaigntransfer2china 目录 题目描述: 暴力递归: 动态规划: 题目描述: 给你一个…...
在Java中操作Redis(详细-->从环境配置到代码实现)
在Java中操作Redis 文章目录 在Java中操作Redis1、介绍2、Jedis3、Spring Data Redis3.1、对String的操作3.2、对哈希类型数据的操作3.3、对list的操作3.4、对set类型的操作3.5、对 ZSet类型的数据(有序集合)3.6、通用类型的操作 1、介绍 Redis 的Java客…...
分布式作业调度框架——ElasticJob
1、简介 ElasticJob 是面向互联网生态和海量任务的分布式调度解决方案,由两个相互独立的子项目 ElasticJob-Lite 和 ElasticJob-Cloud 组成。 它通过弹性调度、资源管控、以及作业治理的功能,打造一个适用于互联网场景的分布式调度解决方案,…...
react如何实现数据渲染
React数据渲染是指将组件中的数据映射到页面上,以展示出来。在React中,数据渲染通常是通过JSX和组件的state或props完成的。 JSX是一个类似HTML的语法,可以在其中嵌入JavaScript表达式。在JSX中,可以使用{}包裹JavaScript表达式&…...
在Java中如何使用List集合实现分页,以及模糊查询后分页
物理分页工具类 package com.yutu.garden.utils;import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors;/*** ClassName: PageUtils* Description: 物理分页* Author* Date …...
【JAVA】包装类、正则表达式、Arrays类、Lambda表达式
1 包装类 包装类是8种基本数据类型对应的引用类型 作用:后期的集合和泛型不支持基本类型,只能使用包装类 基本数据类型和其对应的引用数据类型的变量可以互相赋值 基本数据类型引用数据类型 byte Byte short Short int Integer long Long ch…...
Java中的Maven Assembly插件是什么?
Maven Assembly插件是Maven中的一个插件,用于创建自定义的构建过程。它允许你在构建过程中执行一些自定义的操作,例如打包、编译、复制文件等。对于新手来说,Maven Assembly插件可能有点复杂,但是我们可以使用一些幽默的方式来解释…...
SpringBoot禁用Swagger3
Swagger3默认是启用的,即引入包就启用。 <dependency><groupId>io.springfox</groupId><artifactId>springfox-boot-starter</artifactId><version>3.0.0</version> </dependency> <dependency><groupId…...
小红书Java后端2023-8-6笔试
小红书推荐系统 时间限制:3000MS;内存限制:589824KB 题目描述 小红书有一个推荐系统,可以根据用户搜索的关键词推荐用户希望获取的内容。现在给定小孩的搜索记录(记录是分词后的结果),我们认…...
metaRTC7 demo mac/ios编译指南
概要 metaRTC7.0开始全面支持mac/ios操作系统,新版本7.0.023 mac os demo 包含有srs/zlm的推拉流演示。发布版自带了x64版第三方类库,arm版第三方类库还需开发者自己编译。 源码下载 下载文件metartc7.023.7z https://github.com/metartc/metaRTC/re…...
systemd-journal 占用内存的问题
最近发现部分 Debian 机器的 systemd-journal 占用了非常多内存。这和 Debian 对其的 错误配置有关系(查了一下其他发行版,有和 Debian 一样的配置的也有和 Debian 不一样 的配置的,说明这个配置有争议)。 systemd-journal 简介 …...
Java # Spring(2)
一、Spring事物 一、分类 编程式事物:代码中硬编码(不推荐使用) 声明式事物:配置文件中配置(推荐使用) 分类: 基于xml的声明式事物基于注解的声明式事物 二、隔离级别 ISOLATION_DEFAULT&…...
2021年03月 C/C++(二级)真题解析#中国电子学会#全国青少年软件编程等级考试
第1题:石头剪刀布 石头剪刀布是常见的猜拳游戏。石头胜剪刀,剪刀胜布,布胜石头。如果两个人出拳一样,则不分胜负。 一天,小A和小B正好在玩石头剪刀布。已知他们的出拳都是有周期性规律的,比如:“…...
应用程序运行报错:First section must be [net] or [network]:No such file or directory
应用程序报错环境: 在linux下,调用darknet训练的模型,报错:First section must be [net] or [network]:No such file or directory,并提示:"./src/utils.c:256: error: Assertion 0 failed." 如…...
【ECMAScript】ES6-ES11学习笔记
文章目录 注意事项1.声明变量2.定义常量3.解构赋值4.模板字符串5.简化对象写法6.箭头函数7.参数默认值8.rest参数9.扩展运算符10.Symbol11.生成器函数12.Promise基本语法13.集合set14.Map15.类class16.数值扩展17.对象私有属性18.对象方法扩展19.js文件模块化20.async和await21…...
K8S MetalLB LoadBalancer
1. 简介 kubernetes集群没有L4负载均衡,对外暴漏服务时,只能使用nodePort的方式,比较麻烦,必须要记住不同的端口号。 LoadBalancer:使用云提供商的负载均衡器向外部暴露服务,外部负载均衡器可以将流量路由…...
kubernetes二进制部署2之 CNI 网络组件部署
CNI 网络组件部署 一:K8S提供三大接口1容器运行时接口CRI2云原生网络接口CNI3云原生存储接口CSI 部署 flannelK8S 中 Pod 网络通信:Overlay Network:VXLAN:Flannel:Flannel udp 模式的工作原理:ETCD 之 Flannel 提供说…...
docker通用镜像方法,程序更新时不用重新构建镜像
docker通用镜像方法,程序更新时不用重新构建镜像。更新可执行文件后,重新启动容器就可运行。 功能 1、在demo目录下添加脚本文件start.sh,里面执行demo.jar文件。 2、将demo目录映射到镜像下的 /workspace目录。 3、Dockerfile文件中默认…...
Spring Cloud构建微服务断路器介绍
什么是断路器 断路器模式源于Martin Fowler的Circuit Breaker一文。“断路器”本身是一种开关装置,用于在电路上保护线路过载,当线路中有电器发生短路时,“断路器”能够及时的切断故障电路,防止发生过载、发热、甚至起火等严重后果…...
[国产MCU]-BL602开发实例-OLED-SSD1306驱动与U8g2移植
OLED-SSD1306驱动与U8g2移植 文章目录 OLED-SSD1306驱动与U8g2移植1、OLED介绍2、SSD1306介绍2、U8g2介绍3、U8g2移植3.1 定义U8g2图形库的移植函数3.2 移植函数实现3.3 移植函数调用4、驱动测试本文将详细介绍如何在BL602中移植U8g2图形库,并通过U8g2库驱动OLED SSD1306显示屏…...
AI+3D视觉重塑金属圆棒自动化上下料:高精度、快节拍、降成本实战案例
在汽车、金属加工等核心制造领域,金属圆棒作为基础关键工件,其上下料环节的自动化水平直接决定产线效率与产品一致性。传统人工上下料存在强度大、效率低、精度波动、易损伤工件等痛点,而**AI3D视觉引导机器人**正成为破解该场景瓶颈的主流技…...
Blender3mfFormat插件实战指南:5个关键步骤实现3D打印工作流优化
Blender3mfFormat插件实战指南:5个关键步骤实现3D打印工作流优化 【免费下载链接】Blender3mfFormat Blender add-on to import/export 3MF files 项目地址: https://gitcode.com/gh_mirrors/bl/Blender3mfFormat Blender3mfFormat是一款专为Blender设计的3M…...
很多人对渗透测试工程师的认知停留在“模拟黑客攻击”,但实际工作内容远比这更全面。
在上一篇渗透测试入门指南发布后,很多粉丝私信我:“成为一名合格的渗透测试工程师,到底需要具备哪些硬实力?”“入行后该如何规划职业路径,避免原地踏步?”“企业招聘时更看重哪些技能和经验?”…...
Phi-4-mini-reasoning辅助软件测试:智能生成测试用例与缺陷推理
Phi-4-mini-reasoning辅助软件测试:智能生成测试用例与缺陷推理 1. 引言:当AI遇见软件测试 "昨天又加班到凌晨,就为了赶测试用例..."这是测试工程师小王的日常吐槽。在软件测试领域,编写全面的测试用例和发现潜在缺陷…...
智能电脑排班系统V2024|全自动、高自由度、零门槛排班工具
温馨提示:文末有联系方式产品定位:新一代智能电脑排班系统 扩展版智能排班软件(2024最新稳定版)是一款专为中小团队设计的桌面级自动化排班解决方案。 它融合AI逻辑引擎与人性化交互,兼顾智能调度与人工干预自由度&…...
后悔没早看!敏感肌日常修护全攻略,轻松养出健康厚脸皮✨
后悔没早看!敏感肌日常修护全攻略,轻松养出健康厚脸皮✨集美们!谁懂啊🥹 作为天生的薄皮敏感肌,换季泛红、刷酸烂脸、遇热就红通通这些破事我全中!折腾了五六年,踩了无数坑,终于总结…...
ollama v0.20.4 正式发布!MLX 性能大幅提升 , Gemma4 闪光注意力全面启用
前言 2026年4月9日,本地大模型运行框架ollama正式推出v0.20.4 Latest稳定版本。本次更新围绕MLX硬件加速性能优化、Gemma4系列模型支持、前端代码规范、Safetensors模型创建流程、函数调用输出能力、MLX动态库兼容、集成测试体系搭建等多个核心维度展开,…...
Reportr部署实战:如何在Heroku和自有服务器上快速搭建个人数据仪表板
Reportr部署实战:如何在Heroku和自有服务器上快速搭建个人数据仪表板 【免费下载链接】dashboard Your lifes personal dashboard. 项目地址: https://gitcode.com/gh_mirrors/das/dashboard Reportr是一个功能强大的开源个人数据仪表板应用,能够…...
从付费软件到自主开发:我用AI和FFmpeg实现了一个录屏工具淌
我为什么会发出这个疑问呢?是因为我研究Web开发中的一个问题时,HTTP请求体在 Filter(过滤器)处被读取了之后,在 Controller(控制层)就读不到值了,使用 RequestBody 的时候。 无论是字…...
C++头文件详解:<iomanip> 头文件使用详解
目录 一、前言 二、浮点数精度控制 2.1 fixed 与 setprecision() (1)fixed 的作用 (2)setprecision(n) 的作用 (3)示例:RGB 转 YUV 计算 2.2 scientific 科学计数法 三、设置输出宽度与…...
