每天一道leetcode:516. 最长回文子序列(动态规划中等)

news2024/10/3 8:23:44

今日份题目:

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

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

示例1

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

示例2

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

提示

  • 1 <= s.length <= 1000

  • s 仅由小写英文字母组成

题目思路

动态规划,使用二维dp数组记录[i,j]间的最大回文子序列长度。

开始的时候,我尝试使用reverse ( s.begin ( ) , s.end ( ) )翻转字符串判断连续相同位置的最大长度,最后发现与这道题不同,这道题目允许跨某些字母满足回文,所以放弃原来的想法,不过翻转后再动态规划或许也可以,欢迎感兴趣的朋友试一下,评论区讨论哦!

接下来继续讲这道题目的思路。

因为需要枚举区间内的最大长度,如果从前往后遍历,开始的区间跨度太大,可以理解为第一次判断就得出最后返回的结果,肯定是不对的,所以是从最后位置开始遍历i,j就是i+1到最后。然后,回文要满足两头的字母一样,所以对遍历出的每组i和j判断字符是否相同,相同的话,就在原长度也就是i+1到j-1范围内的最大长度加上这两个点的长度2;如果不同,当前点就更新为区间内最大长度。最后返回0到长度-1范围内的最大长度即可。

接下来是比较关键和大家比较关心的状态转移方程:

if(i、j处的字符相同)
{
	dp[i][j]=dp[i+1][j-1]+2;//在原来长度的基础上加上这两个字符的长度
} 
else 两头的字符不同
{
	dp[i][j]=max(dp[i+1][j],dp[i][j-1]);//不需要加上这两头的字符,根据相邻范围的值更新
}

代码

class Solution 
{
public:
    int longestPalindromeSubseq(string s) 
    {
        int n=s.size();
        int dp[2000][2000]={0};//表示[i,j]范围内的最长回文子序列的长度
        for(int i=n-1;i>=0;i--) 
        {
            dp[i][i]=1;//单独一个字符,自己就是最长回文子序列
            char c1=s[i];
            for(int j=i+1;j<n;j++) 
            {
                char c2=s[j];
                if(c1==c2) //两头的字符相同
                {
                    dp[i][j]=dp[i+1][j-1]+2;//在原来长度的基础上加上这两个字符的长度
                } 
                else //两头的字符不同
                {
                    dp[i][j]=max(dp[i+1][j],dp[i][j-1]);//不需要加上这两头的字符
                }
            }
        }
        return dp[0][n-1];//找到[0,n-1]的整个字符串中的最长回文子序列长度
    }
};

提交结果

 欢迎大家在评论区讨论,如有不懂的代码部分,欢迎在评论区留言!

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

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

相关文章

Nginx环境搭建以及Docker环境部署

目录 Nginx环境搭建 1.首先创建Nginx的目录并进入 2.下载Nginx的安装包 可以通过FTP工具上传离线环境包&#xff0c;也可通过wget命令在线获取安装包 没有wget命令的可通过yum命令安装 3.解压Nginx的压缩包 4.下载并安装Nginx所需的依赖库和包 安装方式一 安装方式二 --- 也…

hello world, this is my time

case1 2023-08-11 00:19:12 其实我这个人吧, 没事做也会刷点b站和抖音, 而且我经常看罗翔老师讲, 什么是爱, 他说爱是责任, 爱是不离不弃, 爱是有耐心, 爱是安慰, 爱也是陪伴, 爱同时也是一种共生的关系, 两个人彼此之间共生, 互相都希望彼此可以好好的生活下去, 看见对方活的比…

Git全栈体系(六)

第十章 自建代码托管平台-GitLab 一、GitLab 简介 GitLab 是由 GitLabInc.开发&#xff0c;使用 MIT 许可证的基于网络的 Git 仓库管理工具&#xff0c;且具有 wiki 和 issue 跟踪功能。使用 Git 作为代码管理工具&#xff0c;并在此基础上搭建起来的 web 服务。GitLab 由乌克…

红帽停止公开Linux操作系统(RHEL)源代码,甲骨文等企业成立协会

根据报道&#xff0c;红帽&#xff08;Red Hat&#xff09;在8月11日宣布停止公开企业级Linux操作系统&#xff08;RHEL&#xff09;的源代码后&#xff0c;甲骨文、SUSE和CIQ昨日联合发布了一份声明。声明宣布成立了Open Enterprise Linux Association&#xff08;OpenELA&…

安全测试中常见的业务安全问题

“在测试过程中&#xff0c;特殊的操作往往容易触发异常场景&#xff0c;而这些异常场景也很容易引起安全问题&#xff01;” 常见的安全漏洞就不多说了&#xff0c;这里主要介绍常见的业务安全问题及修复建议。 01 刷短信 问题描述&#xff1a; 当发送短信的请求接口只需要…

用最少数量的箭引爆气球——力扣452

文章目录 题目描述解法一题目描述 解法一 int findMinArrowShots(vector<vector<int>>& nums){if(num

什么,你说你不会通过jdbc一次性创建10个数据库???

小朋友你是否有很多问号&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f; 1、在资源文件中建一个文件&#xff0c;填入连接数据库的基本信息。 2、通过反射拿到资源文件。…

LeetCode150道面试经典题--判断子序列(简单)

1.题目 给定字符串 s 和 t &#xff0c;判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些&#xff08;也可以不删除&#xff09;字符而不改变剩余字符相对位置形成的新字符串。&#xff08;例如&#xff0c;"ace"是"abcde"的一个子序…

leetcode19. 删除链表的倒数第 N 个结点

题目&#xff1a;leetcode19. 删除链表的倒数第 N 个结点 描述&#xff1a; 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 思路&#xff1a; 让前面的节点比后面的节点先走n1步&#xff0c;因为从链表的尾节点的下一个节点开始&…

【数据结构】“单链表”的练习题(二)

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …

linux学习(进程创建)[8]

创建进程 myproc.c #include <stdio.h> #include <unistd.h>int main() {printf("我是父进程\n");pid_t id fork();if(id < 0){printf("创建子进程失败\n");return 1;}else if(id 0){while(1){printf("我是子进程&#xff1a; pid…

Java基础入门篇——数组初识

一、数组 1.假设某公司有100个员工&#xff0c;需要统计某公司员工的工资情况&#xff0c;首先需要声明100个变量来分别记每个员工的工资&#xff0c;那么如果按照之前的做法&#xff0c;可能定义的结构如下所示&#xff1a; int a1,a2,a3,......a100; 要求你输出这100个员工…

如何将maven部署在Idea的教学,和idea介绍

目录 一.idea介绍&#xff0c;以及一些基本特点&#xff01; 1.1idea介绍 1.2idea特点 1.3.idea和eclipse区别 1.4idea安装 4.1下载网址 4.2下载后安装&#xff08;见图片&#xff09; 1.5 Idea的一些操作更改 5.1主题颜色 5.2设置鼠标悬浮提示 5.3显示方法分隔符 5.4忽…

如何解决新学期分班查询公布难题?试试这个方法

作为教师&#xff0c;我们常常需要进行学生分班管理&#xff0c;这项工作繁琐但至关重要。为了提高工作效率&#xff0c;我们可以利用现代技术开发一款学生分班查询系统。本文将介绍如何设计和开发这个系统。 首先&#xff0c;我们可以选择使用易查分这样的工具来帮助我们管理…

[git] git基础知识

git是一个免费的、开源的分布式版本控制系统&#xff0c;可以快速高效地处理从小型到大型的各种项目 git易于学习&#xff0c;性能极快 什么是版本控制&#xff1f; 版本控制是一种记录文件内容变化&#xff0c;以便将来查阅特定版本修订情况&#xff0c;可以记录文件修改历史…

(学习笔记-进程管理)多线程冲突如何解决

对于共享资源&#xff0c;如果没有上锁&#xff0c;在多线程的环境里&#xff0c;很有可能发生翻车。 竞争与合作 在单核 CPU 系统里&#xff0c;为了实现多个程序同时运行的假象&#xff0c;操作系统通常以时间片调度的方式&#xff0c;让每个进程每次执行一个时间片&#xf…

现在国家正规相亲平台有哪些?盘点五款安全值得使用的相亲软件

随着互联网的普及&#xff0c;越来越多的人选择通过相亲软件寻找自己的另一半。但是&#xff0c;在众多相亲软件中靠谱的相亲软件有哪些呢&#xff0c;该如何选择&#xff1f;本文将盘点几款安全靠谱的相亲软件&#xff0c;可以了解看看哪个适合你。 第一款&#xff1a;一伴婚…

恭喜又一白鲸开源成员成为 Apache SeaTunnel PMC Member

个人简介 王海林 白鲸开源研发工程师GitHub ID&#xff1a;hailin0做过性能监控、数据开发平台等&#xff0c;目前聚焦在数据集成同步及其周边生态的研发 问&#xff1a;作为白鲸开源的一员&#xff0c;您为社区做出过哪些贡献&#xff1f;具体方案&#xff08;代码类&#x…

OpenStack-Y版安装部署

OpenStack-Y版安装部署 目录 OpenStack-Y版安装部署 1、环境准备 1.1 环境简介1.2 配置hosts解析(所有节点)1.3 配置时间同步1.4 安装openstack客户端(控制节点执行)1.5 安装部署MariaDB(控制节点执行)1.6 安装部署RabbitMQ(控制节点执行)1.7 安装部署Memcache(控制节点执行)2、…

机器学习笔记值优化算法(十四)梯度下降法在凸函数上的收敛性

机器学习笔记之优化算法——梯度下降法在凸函数上的收敛性 引言回顾&#xff1a;收敛速度&#xff1a;次线性收敛二次上界引理 梯度下降法在凸函数上的收敛性收敛性定理介绍证明过程 引言 本节将介绍梯度下降法在凸函数上的收敛性。 回顾&#xff1a; 收敛速度&#xff1a;次…