动态规划-最长回文子序列

news2024/11/25 13:54:19

题目描述

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

示例 1:

输入:s = "bcbbab"

输出:4

解释:一个可能的最长回文子序列为 "bbbb" 。

解题思路

在此前我们已经介绍了一些关于子序列的题目,其中的动态规划思路基本都是 以dp[i] 表示以i为结尾的子串中其中最长的回文子序列的长度。但是在本题中我们不用这种方法,因为

  1. 状态定义不准确
    如果 dp[i] 表示以 i 为结尾的子串中最长的回文子序列的长度,那么这个定义忽略了子序列的起始位置。在LPS问题中,我们需要考虑的是从某个位置 i 开始到某个位置 j 结束的子串中的最长回文子序列,而不仅仅是结束位置。因此,一个更合适的状态定义是 dp[i][j],它同时考虑了子串的起始和结束位置。

  2. 状态转移困难
    如果只用 dp[i] 来表示,那么很难从前面的状态推导出当前状态。因为最长回文子序列可能并不总是以 i 结尾,且它的起始位置可能远远早于 i。在动态规划中,状态转移方程是非常重要的,它决定了如何从已知的子问题解推导出当前问题的解。如果状态定义不准确,那么状态转移方程也会变得复杂或不可行。

  3. 无法覆盖所有情况
    使用 dp[i] 只会考虑以 i 结尾的子序列,而忽略了可能包含 i 但不以 i 结尾的回文子序列。在LPS问题中,我们需要找到的是整个字符串中的最长回文子序列,而不是仅仅以某个字符结尾的最长子序列。

  4. 无法有效利用回文性质
    回文子序列的一个重要性质是对称性。当我们在字符串的两端找到相同的字符时,我们可以利用这一点来减少需要检查的子问题数量。然而,如果仅使用 dp[i],这种对称性就很难被有效利用,因为我们没有关于子序列起始位置的信息。

所以我们需要用其他方法。通常采用 dp[i][j] 来表示从位置 i 到位置 j 的子串中的最长回文子序列的长度。这种定义方式既考虑了子序列的起始位置,也考虑了结束位置,从而能够更准确地描述问题,并使得状态转移方程变得简单且直观。

动态规划思路

  1. 定义状态
    dp[i][j]表示字符串s中从索引i到索引j(包含ij)的子串的最长回文子序列的长度。

  2. 初始化
    i == j时,dp[i][j] = 1,因为单个字符本身就是回文。

  3. 状态转移方程

    • 首先,对于回文串在其首尾加上相同的两个字符,它仍然是一个回文串。
    • 如果s[i] == s[j],那么dp[i][j] = dp[i+1][j-1] + 2,因为两端的字符相同,可以加入到回文子序列中,并且内部的回文子序列长度增加了2。
    • 如果s[i] != s[j],那么dp[i][j] = max(dp[i+1][j], dp[i][j-1]),即最长回文子序列要么不包含s[i],要么不包含s[j],取两种情况下的最大值。
  4. 结果
    最终答案存储在dp[0][n-1]中,其中n是字符串s的长度。

 需要注意的是填表顺序不能按照二维数组从左到右,从上到下的顺序,而是与此前的回文子串题目中相同,按照子串的长度从1到n的顺序填表。

代码示例

class Solution {
public:
    int longestPalindromeSubseq(string s) {
        int n = s.length();
        vector<vector<int>> dp(n, vector<int>(n, 0));

        // 初始化对角线
        for (int i = 0; i < n; ++i) {
            dp[i][i] = 1;
        }

        // 填充dp表
        for (int len = 2; len <= n; ++len) { // 子串长度从2开始
            for (int i = 0; i <= n - len; ++i) {
                int j = i + len - 1;
                if (s[i] == s[j]) {
                    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];
    }
};

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

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

相关文章

图书馆上新了!新华书店×度小满推出“开学季悦读计划”公益活动

2024年9月&#xff0c;新学期伊始&#xff0c;度小满携手新华书店启动“开学季悦读计划”公益行动。本次活动以“开学季&#xff0c;图书馆上新书”为主题&#xff0c;向度小满“小满助力计划”公益项目落地过的五个地区共六所小学和初中捐赠3300余本图书&#xff0c;让孩子们开…

李飞飞团队 ReKep:空间智能机器人可整合 GPT-4o;苹果首款 AI 手机 iPhone 16 发布丨RTE 开发者日报

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE&#xff08;Real-Time Engagement&#xff09; 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文…

一款专业编曲软件Guitar Pro 8中文版安装激活图文教程

Guitar Pro 8中文版是一款专业编曲软件&#xff0c;帮助所有的吉他爱好者学习、创作、设计、绘谱&#xff0c;指法、音色&#xff0c;了解各种吉他方面的内容&#xff0c;除了吉他还有其他十种乐器可以使用&#xff0c;节省时间&#xff0c;提高效率&#xff0c;有助于学习如何…

LLM大模型学习:AI Agent综述

AI Agent是什么 将LLM思想链接到一起&#xff0c;自主实现用户设定的任何目标。只需要告诉AutoGPT一个目标&#xff0c;能自主生成执行计划。 吴恩达&#xff1a;“与其争论哪些工作才算是真正的 Agent&#xff0c;不如承认系统可以具有不同程度的 Agentic 特性。” 核心在于…

TCP 为什么是三次握手,而不是两次或四次?(通俗易懂)

TCP 三次握手是为了保证&#xff1a;让客户端和服务器都知道自己和对方的发送和接收都没问题。 换句话说&#xff0c;可以 假设客户端和服务端都维护了四个布尔变量&#xff1a;自己发送&#xff0c;自己接收&#xff0c;对方发送&#xff0c;对方接收。 初始值为 false&#…

ROS第三梯:ROS+C++实现速腾Bag包的解析

解决问题&#xff1a;速腾Bag包利用bag_to_pcd生成的pcd文件字段名称存在问题&#xff0c;多了几个异常的"_"&#xff0c;导致强度属性无法在Intensity中显示。 解决方案&#xff1a;利用sensor_msgs库进行数据读取和转换成sensor_msgs::PointCloud格式&#xff0c;再…

避免17个最常见的电子邮件营销错误

我们都曾在电子邮件营销中犯过错。你点击发送&#xff0c;随后那种沉重的感觉袭来。你搞砸了&#xff0c;现在所有人都能看到。就像把信息放入瓶子丢进互联网的浩瀚海洋中&#xff0c;无法收回。 有些电子邮件营销错误显而易见&#xff0c;可能会破坏你投入了大量心血的营销活…

多窗口联系

使用信号和槽实现多个界面的跳转 准备好两个界面 一个界面准备好信号 一个界面准备好槽 连接两个界面的信号和槽 主界面的头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Wi…

俄罗斯电商没有技巧,OZON换季相关爆品

Top1 加热器 Обогреватель кварцевый напольный ИЖЭКО М 800 вт СВ01 энергосберегающий электрообогреватель 商品id&#xff1a;1352359815 月销量&#xff1a;781 OZON选品分析工具&#…

Xilinx系FPGA学习笔记(六)RAM的IP核学习

系列文章目录 文章目录 系列文章目录块RAM生成 块RAM生成 对于RAM来说&#xff0c;也有两种: 在 Memories & Storage Elements 下&#xff0c;一个是 Distributed Memory Generator&#xff0c;另一个是 BlockMemory Generator&#xff0c;这与ROM是类似的 这里的常规接口…

CSP-CCF★★★201812-2小明放学★★★

目录 一、问题描述 二、解答 &#xff08;1&#xff09;注意&#xff1a; &#xff08;2&#xff09;80分版&#xff1a; &#xff08;3&#xff09;100分版&#xff1a; 三、总结 一、问题描述 二、解答 &#xff08;1&#xff09;注意&#xff1a; 题目的n小于等于10的…

9月10(信息差)

&#x1f30d;华为最便宜小折叠&#xff01;华为nova Flip今晚发布&#xff1a;搭载麒麟8000芯片 从曝光的跑分信息来看&#xff0c;nova Flip将搭载麒麟8000处理器&#xff0c;也就是nova 12 Pro/Ultra的同款&#xff0c;采用8核心的134组合&#xff0c;大核是1颗2.4GHz的Cort…

怎么画实体关系图E-R?用这款在线绘图工具简单又好用!

ER图(Entity-Relationship Diagram&#xff0c;即实体-关系图)是一种用于数据库设计的图形化工具&#xff0c;用于描述现实世界的概念模型。它由Peter Chen于1976年首次提出&#xff0c;现已成为数据库建模和系统分析设计中最常用的工具之一。 ER图通过图形化的方式&#xff0…

Mamba模型学习笔记

笔记来源&#xff1a;bilibili Transformer 的死穴 Transformer 结构的核心是自注意力机制层&#xff0c;无论是 encoder 还是 decoder&#xff0c;序列数据都先经过位置编码后喂给这个模块。 但是自注意力机制的计算范围仅限于窗口内&#xff0c;而无法直接处理窗口外的元素…

支持iPhone 16新品预售,饿了么同步上线专人配送等特色服务

9月10日凌晨&#xff0c;2024年 Apple 秋季新品发布会上正式揭晓iPhone 16新机。9月10日一早&#xff0c;饿了么同步宣布&#xff1a;今年将携手近4000家Apple 授权专营店&#xff0c;支持iPhone 16新品预售及现货的同步开售。新机现货首发当日&#xff0c;饿了么消费者最快半小…

Mysql | 知识 | 事务隔离级别

转账案例缘起 我的钱包&#xff0c;共有 100 元。 今天我心情好&#xff0c;我决定给你的转账99元&#xff0c;最后的结果肯定是我的余额变为 1元&#xff0c;你的余额多了99元。 转账这一动作在程序里会涉及到一系列的操作&#xff0c;假设我向你转账 99元 的过程是有下面这…

哪些原因导致ERP成功率这么低?

哪些原因导致ERP成功率这么低&#xff1f; 有一句名言是“幸福的家庭都是相似的&#xff0c;不幸的家庭却各有各的不幸。”&#xff0c;这句名言应用到企业数字化的实施落地中也是适用的&#xff0c;数字化成功实施的企业也都是相似的&#xff0c;数字化实施失败的企业却有各种…

安卓玩机工具-----适合安卓机型的“搞机工具箱” 功能齐全 玩机推荐

搞机工具箱最新版是一款相当出色的电脑端手机工具箱软件&#xff0c;搞机工具箱正式版功能强劲&#xff0c;可以帮助用户不需要root就能够直接对手机进行调节&#xff0c;方便对手机进行更加全面的掌控&#xff0c;搞机工具箱便捷好用&#xff0c;只需要根据文字提示及自己的需…

开源的 Windows 12 网页体验版!精美的 UI 设计、丰富流畅的动画

大家周二好呀&#xff01;博主今天给小伙伴们分享一款炫酷的 Windows 12 体验版&#xff0c;网页效果拉满&#xff0c;非常值得我们去尝试&#xff01; 如果你对未来的Windows操作系统充满期待&#xff0c;那么这款开源的Windows 12 网页体验版绝对不容错过&#xff01;这不仅…

如何编辑pdf文件?金舟PDF编辑器解决PDF编辑、转换问题!

如何编辑pdf文件&#xff1f;pdf是电脑上便携的文档格式之一&#xff0c;不管是阅读&#xff0c;还是打印&#xff0c;都不会出现排版错乱的问题&#xff0c;并且在任意系统上都能“正常”展示&#xff0c;不受影响。这也是pdf文件运用较为广泛的原因之一。 不少用户在接触到pd…