力扣516-最长回文子序列(Java详细题解)

news2024/9/24 22:41:56

题目链接:力扣516-最长回文子序列

前情提要:

因为本人最近都来刷dp类的题目所以该题就默认用dp方法来做。

dp五部曲。

1.确定dp数组和i下标的含义。

2.确定递推公式。

3.dp初始化。

4.确定dp的遍历顺序。

5.如果没有ac打印dp数组 利于debug。

每一个dp题目如果都用这五步分析清楚,那么这道题就能解出来了。

题目思路:

如果你做过力扣647-回文子串或者看过我的那篇题解,那么做本题你会轻松不少。

本题题目要求找出s的最长回文子序列的长度。

注意这里的子序列可以不用连续。

话不多说直接开始我们的dp五部曲。

1.确定dp数组和i下标的含义。

该题的dp数组定义与力扣647相似,都要考虑回文串的性质。

所以dp[i] [j]定义的就是[i,j]范围内的最长回文子序列的长度。

2.确定递推公式。

在判断回文子串的题目中,关键逻辑就是看s[i]与s[j]是否相同。

如果s[i]与s[j]相同,那么dp[i] [j] = dp[i + 1] [j - 1] + 2;

在这里插入图片描述

如果不同,我们就要删除其中一个元素来看加上另外一个元素是否可以增加我们回文子序列的长度。

也就是说。如果s[i]与s[j]不相同,说明s[i]和s[j]的同时加入 并不能增加[i,j]区间回文子序列的长度,那么分别加入s[i]、s[j]看看哪一个可以组成最长的回文子序列。

那我们要删除哪个元素呢,不是由我们决定,主要由递推公式决定。

在这里插入图片描述

dp[i] [j] = Math.max(dp[i - 1] [j],dp[i] [j - 1]);

3.dp初始化。

由递推公式可以看出dp[i] [j]是由dp[i + 1] [j - 1]推出。

注意这里的j一定是比i要大于等于的。所以他们递推的起点其实就是i = j的时候。

重点就在于i == j的时候,当i == j时就说明这一个元素的最长回文子序列就为他本身 那么 dp[i] [j] = 1;

4.确定dp的遍历顺序。

由递推公式可以看出dp[i] [j]是由dp[i + 1] [j - 1]推出。

在二维dp数组可以看出是由它的左下方推出,所以需要从下到上,从左到右遍历。

所以遍历顺序为:

for(int i = s.length() - 1;i >= 0;i --){
            for(int j = i + 1;j < s.length();j ++){
                if(s.charAt(i) == s.charAt(j)){
                    dp[i][j] = dp[i + 1][j - 1] + 2;
                }else{
                    dp[i][j] = Math.max(dp[i + 1][j],dp[i][j - 1]);
                }
            }
        }

5.如果没有ac打印dp数组 利于debug。

在这里插入图片描述

class Solution {
    public int longestPalindromeSubseq(String s) {
        //dp的定义 在i到j的范围内的最长回文子序列的长度
        int [][] dp = new int [s.length() + 1][s.length() + 1];
        //递推公式 根据回文串的性质
        //如果下标为i和j的元素相同那么在i到j的范围内的最长回文子序列的长度就为i + 1到j - 1的范围内的最长回文子序列的长度 + 2
        //如果不相同 那么就可以删除下标i和j的任意一个元素  具体选择哪个 肯定要选择删除后获得更长的回文子序列
        //初始化
        //其实也可以由递推公式可以看出,每次都是由dp[i + 1][j - 1]推出。
        //重点就在于i == j的时候,当i == j时就说明这一个元素的最长回文子序列就为他本身 那么 dp[i][j] = 1;
        for(int i = 0;i < s.length();i ++){
            //在这里dp[i][i] 其实就是j = i的情况
            dp[i][i] = 1;
        }
        //遍历顺序 该题的递推是由dp[i + 1][j - 1]推出。
        //在二维dp数组中就是由它的左下方推出来,所以就要从下到上从左到右遍历
        for(int i = s.length() - 1;i >= 0;i --){
            for(int j = i + 1;j < s.length();j ++){
                if(s.charAt(i) == s.charAt(j)){
                    dp[i][j] = dp[i + 1][j - 1] + 2;
                }else{
                    dp[i][j] = Math.max(dp[i + 1][j],dp[i][j - 1]);
                }
            }
        }
        //根据dp数组的定义 最后收集结果的地方就在于在0到s.length() - 1的范围内的最长回文子序列的长度 也就是整个字符串的最长回文子序列的长度
        return dp[0][s.length() - 1];
    }  
}

这一篇博客就到这了,如果你有什么疑问和想法可以打在评论区,或者私信我。

我很乐意为你解答。那么我们下篇再见!

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

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

相关文章

后端开发工程师转行大模型领域:全面学习路线指南,非常详细收藏我这一篇就够了

随着人工智能技术的迅猛发展&#xff0c;特别是大模型&#xff08;如GPT-3、BERT等&#xff09;在自然语言处理、计算机视觉等多个领域的广泛应用&#xff0c;越来越多的技术人员开始考虑转型至这一充满挑战与机遇的新领域。对于已经在后端开发领域积累了丰富经验的工程师来说&…

如何解决软件企业文件传输难题?这款FTP替代工具一定适合你!

在信息技术飞速发展的今天&#xff0c;软件企业的数据传输需求不断攀升。传统的FTP&#xff08;文件传输协议&#xff09;虽然一度是企业数据交换的中坚力量&#xff0c;但其在多个方面的局限性逐渐成为企业发展的障碍。接下来&#xff0c;我们将探讨FTP的不足&#xff0c;并介…

值得入手的宠物空气净化器——希喂、352、IAM三款产品真实测评

在快节奏的现代生活中&#xff0c;养宠成为很多人的精神寄托&#xff0c;回到家中与猫咪玩耍是一天中最放松的时刻。但这美好的生活也存在着一些烦恼——宠物毛发清理与异味。宠物空气净化器作为一种新兴的清理工具&#xff0c;以其高效、全面的特点&#xff0c;受到了越来越多…

MySQL学习笔记(持续更新中)

1、Mysql概述 1.1 数据库相关概念 三个概念&#xff1a;数据库、数据库管理系统、SQL 名称全称简称数据库存储数据的仓库&#xff0c;数据是有组织的进行存储DataBase&#xff08;DB&#xff09;数据库管理系统操纵和管理数据库的大型软件DataBase Mangement System&#xf…

什么是动态数据脱敏?

原文地址 https://www.bytebase.com/blog/what-is-dynamic-data-masking/ 动态数据脱敏&#xff08;DDM&#xff09;动态更改返回给应用程序或用户的数据库记录&#xff0c;以此来实时保护敏感数据&#xff0c;且不会更改静态数据。 DDM 与静态数据脱敏&#xff08;SDM&#x…

OpenHarmony(鸿蒙南向)——平台驱动开发【MIPI DSI】

往期知识点记录&#xff1a; 鸿蒙&#xff08;HarmonyOS&#xff09;应用层开发&#xff08;北向&#xff09;知识点汇总 鸿蒙&#xff08;OpenHarmony&#xff09;南向开发保姆级知识点汇总~ 持续更新中…… 概述 功能简介 DSI&#xff08;Display Serial Interface&#x…

身为程序员,转行请慎重:考虑以下几点再决定是否转向大模型领域

在决定从程序员转型到大模型领域之前&#xff0c;有几个关键点需要认真考虑。这些因素将帮助你更全面地评估这一转变是否适合你的职业规划和个人情况。 个人兴趣与激情 自我反思&#xff1a;你对人工智能、深度学习和自然语言处理等领域是否有浓厚的兴趣&#xff1f;兴趣是最好…

【论文解析】基于开源 Matrix 指令集扩展(矢量点积)的高性能 RISC-V 处理器“香山”(nanhu 版本)的 LLM 加速的研究

作者及发刊详情 摘要 正文 主要工作贡献 1&#xff09;针对大模型自定义矢量点积扩展指令&#xff0c;并设计了专用硬件加速大语言模型的运算 2&#xff09;基于香山处理器增加矢量点积计算单元和流水线处理逻辑&#xff0c;开发了包含上述指令的处理器nanhu-vdot 3&…

【环境搭建】MySQL安装部署

Win64安装MySQL Windows的玩法比较少&#xff0c;没有像MAC一样给你提供mysqld-safe等等各种的启动脚本&#xff0c;只有手动启动或者是以服务启动Mysql。 点击下载&#xff1a;MySQL5.5-8.0.7z (密码是11) 1.下载软件 这一步下载好软件就可以了&#xff0c;下载地址&#xff…

鸿蒙OpenHarmony【小型系统基础内核(进程管理任务)】子系统开发

任务 基本概念 从系统的角度看&#xff0c;任务Task是竞争系统资源的最小运行单元。任务可以使用或等待CPU、使用内存空间等系统资源&#xff0c;并独立于其它任务运行。 OpenHarmony 内核中使用一个任务表示一个线程。 OpenHarmony 内核中同优先级进程内的任务统一调度、运…

《数据压缩入门》笔记-Part 1

一篇文章显得略长&#xff08;超过1w字&#xff09;&#xff0c;本文对应原书序言、前言、第1-5章。 第6-10章请参考Part 2&#xff0c;第11-15章&#xff0c;请参考Part 3。 序言 几点发现&#xff1a; 数据压缩需要花费时间并可能会导致软件变慢&#xff1b;改变数据的组织…

C++第一次练习

题目1 class Solution { public:bool isletter(char s){if(s<z&&s>a)return true;if(s>A&&s<Z)return true;return false;}string reverseOnlyLetters(string s) {if(s.empty()){return s;}int left,right;left0;rights.size()-1;while(left<ri…

最新绿豆影视系统 /反编译版源码/PC+WAP+APP端 /附搭建教程+软件

源码简介&#xff1a; 最新的绿豆影视系统5.1.8&#xff0c;这可是个反编译版的源码哦&#xff01;它不仅支持PC端、WAP端&#xff0c;还有APP端&#xff0c;一应俱全。而且附上了搭建教程和软件&#xff0c;安卓和苹果双端都能用&#xff0c;实用方便&#xff01; 优化内容&…

聆思CSK6大模型开发板上手参考

前面发了很多大模型语音交互相关的技术文章&#xff0c;这篇给大家介绍一下大模型语音交互示例的硬件和上手概况。 硬件概况 聆思CSK6大模型开发板长宽尺寸是99.1x72.1mm&#xff0c; 集成了摄像头、麦克风、扬声器、屏幕、无线模块、TF卡等&#xff0c;可以直接用于大模型语音…

2k1000LA 调试HDMI

问题: 客户需要使用HDMI 接口,1080p 的分辨率。 ---------------------------------------------------------------------------------------------------------------- 这里需要看看 龙芯派的 demo 版 的 硬件上的连接。 硬件上: 官方的demo 板 , dvo1 应该是 HDMI的…

如何选择游戏高防服务器,有什么需要注意的点?

自二十世纪初互联网迅速发展&#xff0c;市场发展瞬息万变&#xff0c;游戏行业也迎来了发展的春天。如今游戏行业已成为互联网行业的支柱&#xff0c;占据市场重要的比重。对于游戏行业的企业来说选择服务器是至为重要的一步&#xff0c;市场上的服务器良莠不济&#xff0c;如…

你的提交信息还在拖后腿?看这里,提升代码质量的绝招!

文章目录 前言一、什么是约定式提交&#xff1f;二、创建新仓库三、将代码推送到远程仓库的步骤1.检查当前远程仓库2.添加代码到暂存区3. 进行约定式提交4. 推送代码到远程仓库5. 完成推送 总结 前言 在当今软件开发领域&#xff0c;Git已经成为最广泛使用的版本控制系统之一。…

SpringMVC简单入门操作

一、创建项目 1、创建Maven项目并导入依赖 <dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency><!-- https:/…

2024年9月23日---关于MyBatis框架(2)

4.7 不同返回值类型的查询 4.7.1 返回基本数据类型 /**查询student表中的记录个数 */ int selectCount(); <select id"selectCount" resultType"_int">select count(*) from student; </select> 4.7.2 返回引用类型(实体类) /**返回值为实…

LeetCode题练习与总结:二叉树的最近公共祖先--236

一、题目描述 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个节点 p、q&#xff0c;最近公共祖先表示为一个节点 x&#xff0c;满足 x 是 p、q 的祖先且 x 的深度尽可能大&#xff08;一个节点也…