【刷题题解】最长回文子序列

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

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

这道题,一眼动态规划,但是即使动起来也规划不了一点😅

好,这道题,我们可以这样子思考,先把视线聚焦在单个字符上,单个字符是s【i】就是一个回文字符串,所以,在此基础上,我们去扩展他的左右两边,如果s【i-1】==s【i+1】,那么回文字符串的长度加上这两个元素的长度2(即加2),否则,当前字符串的最长回文子字符串长度为max(包含左边界的最长字串长度,包含右边界的最长字符串)

大致思路就是这样子,我们用程序来拆分。

对于字符串 s,设 dp[i][j] 表示子串 s[i...j] 中最长回文子序列的长度。我们想要计算的最终结果是 dp[0][n-1],其中 n 是字符串 s 的长度。

  • 初始化:对于任何字符串,如果取长度为 1,即 i == j,那么最长回文子序列的长度就是 1,因为每个单独的字符都是一个回文序列。所以,dp[i][i] = 1 对所有 0 <= i < n

  • 状态转移方程

    • 如果 s[i] == s[j],那么我们找到了一对匹配的字符,可以在 s[i+1...j-1] 的基础上增加 2,即 dp[i][j] = dp[i+1][j-1] + 2
    • 如果 s[i] != s[j],那么最长回文子序列要么在 s[i+1...j] 中,要么在 s[i...j-1] 中,所以 dp[i][j] = max(dp[i+1][j], dp[i][j-1])
  • 填表顺序:由于计算 dp[i][j] 需要知道 dp[i+1][j-1]dp[i+1][j]dp[i][j-1] 的值,因此我们需要从底部开始填表,即从 i = n-1 开始向 i = 0 遍历,同时 ji 开始向 n-1 遍历。

首先,通过Array.from和箭头函数初始化一个二维数组dp,然后按照状态转移方程填充这个数组。最后,返回dp[0][n - 1]的值作为整个字符串s的最长回文子序列长度。

function longestPalindromeSubseq(s) {const n = s.length;const dp = new Array(n).fill(0).map(() => new Array(n).fill(0));// 初始化,单个字符的情况for (let i = 0; i < n; i++) {dp[i][i] = 1;}// 填表for (let i = n - 2; i >= 0; i--) { // 从倒数第二行开始向上for (let j = i + 1; j < n; j++) { // 从左到右if (s[i] === s[j]) {dp[i][j] = dp[i + 1][j - 1] + 2;} else {dp[i][j] = Math.max(dp[i + 1][j], dp[i][j - 1]);}}}return dp[0][n - 1]; // 返回整个字符串的最长回文子序列长度
}

我看有人提出将字符串翻转,然后求两个字符串的最长公共子序列就可以了。

这个思路是基于:字符串的最长回文子序列与其翻转后字符串的最长公共子序列(Longest Common Subsequence, LCS)长度相同。这是因为回文子序列在原字符串中的顺序和在翻转字符串中的顺序是相反的,而LCS正是寻找这样的序列。

思路分析

  1. 翻转字符串:首先,得到原字符串s的翻转字符串reverseS
  2. 求最长公共子序列(LCS):然后,求原字符串s和翻转字符串reverseS的最长公共子序列的长度。这个长度即为原字符串的最长回文子序列的长度。

动态规划求LCS

对于字符串s和它的翻转字符串reverseS,设dp[i][j]表示s[0...i-1]reverseS[0...j-1]的最长公共子序列的长度。状态转移方程如下:

  • 如果s[i-1] == reverseS[j-1],那么dp[i][j] = dp[i-1][j-1] + 1
  • 否则,dp[i][j] = max(dp[i-1][j], dp[i][j-1])
function longestPalindromeSubseq(s) {const n = s.length;const reverseS = s.split('').reverse().join('');const dp = new Array(n).fill(0).map(() => new Array(n).fill(0));for (let i = 1; i <= n; i++) {for (let j = 1; j <= n; j++) {if (s[i - 1] === reverseS[j - 1]) {dp[i][j] = dp[i - 1][j - 1] + 1;} else {dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);}}}return dp[n][n]; // 返回整个字符串的最长回文子序列长度
}

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

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

相关文章

突破编程_C++_面试(基础知识(5))

面试题9&#xff1a;什么是内存地址 内存地址是指计算机内存中存储变量或对象的地址。内存空间大小就是寻址能力&#xff0c;即能访问到多少个地址&#xff0c;比如 32 位机器内存空间大小就是 2^32 4294967296&#xff0c;也就是 4 GB 。每个变量或对象在内存中都有一个唯一…

python_蓝桥杯刷题记录_笔记_全AC代码_入门3

前言 记录我的解法以及笔记思路&#xff0c;谢谢观看。 题单目录 1.P2141 [NOIP2014 普及组] 珠心算测验 2.P1567 统计天数 3.P1055 [NOIP2008 普及组] ISBN 号码 4.P1200 [USACO1.1] 你的飞碟在这儿 Your Ride Is Here 5.P1308 [NOIP2011 普及组] 统计单词数 6.P1047 […

2024.2.3日总结(animate.css)

animate.css animate.css是一个动画库&#xff0c;可以方便快速的制作出常见的动画效果&#xff0c;很适合强调&#xff0c;主页&#xff0c;滑块和注意力引导提示。 它预设了弹跳&#xff08;bounce&#xff09;&#xff0c;摇摆&#xff08;swing&#xff09;&#xff0c;颤…

CF1538 补题报告

CF1538补题报告&#xff08;A.B.C.D.F.G.&#xff09; Codeforces Round 725 (Div. 3) A. Stone Game A. 石头游戏 题意 给定一个序列&#xff0c;每次只能删除最左边或最右边的元素&#xff0c;求出删除最大和最小值需要多少次删除操作。 思路 找到最大值和最小值所在的…

C#创建lnk快捷方式

1&#xff0c;引用Com组件:Windows Script Host Object Model。 2&#xff0c;获取开始目录路径、桌面路径&#xff0c;并创建相应文件夹。 //获取当前开始目录,桌面//当前值为:C:\Users\admin\AppData\Roaming\Microsoft\Windows\Start Menu//实际需要的路径是:C:\Users\adm…

深度学习之循环神经网络进阶

这一讲我们学习如何实现一个循环神经网络的分类器&#xff1a; 我们要解决的问题是名字分类&#xff0c;我们根据名字找到其对应的国家。 上一讲我们介绍了循环神经网络。 我们在处理自然语言的时候我们通常是以上这种方式&#xff0c;我们在处理单词的时候&#xff0c;通常…

一文彻底搞懂MySQL基础:B树和B+树的区别(简洁版)

文章目录 1. 节点结构2. 插入和删除3. 查询4. 性能5. 适用场景6.关于 B树和 B树的常见问题6.1. B树和B树的区别是什么&#xff1f;6.2. 什么情况下应该使用 B树&#xff1f;6.3. 什么情况下应该使用 B树&#xff1f; B树和B树都是多路搜索树&#xff0c;它们都用于数据库索引中…

QT自用,勿点

自己有接近2年的前端经验&#xff08;html,js,jq,vue之类的&#xff09;&#xff0c;但是一直对QT不是很熟悉&#xff0c;之前零散的学了一些&#xff0c;但是平时不怎么做界面&#xff0c;这几天系统的学一下。 1.7 创建第一个Qt项目_哔哩哔哩_bilibili 文档: *Qt中的信号槽…

命令注入漏洞原理以及修复方法

漏洞名称 &#xff1a;命令注入 漏洞描述&#xff1a;Command Injection&#xff0c;即命令注入攻击&#xff0c;是指由于Web应用程序对用户提交的数据过滤 不严格&#xff0c;导致黑客可以通过构造特殊命令字符串的方式&#xff0c;将数据提交至Web应用程序中&#xff0c;并利…

一文讲明Jetpack中的图片组件

Jetpack Compose系列(5) - 图片组件 Jetpack Compose中的常用图片组件有两个&#xff1a;Icon和Image。从命名上就不难看出这两个组件在内容呈现上就是负责图形和图片相关。 需要说明的是&#xff0c;Compose获取资源方式有四种&#xff1a; 文本 -> stringResource(R.s…

C# 从“byte[]”转换为“BitmapImage”

要从字节数组 (byte[]) 转换为 System.Windows.Media.Imaging.BitmapImage&#xff0c;你需要使用一个内存流 (MemoryStream) 来读取字节数组&#xff0c;并利用这个流来初始化 BitmapImage。以下是如何执行这一转换的详细步骤和代码示例&#xff1a; 将字节数组转换为 Bitmap…

比特币ETF广告战大爆发!

作者&#xff1a;秦晋 贝莱德主动发起广告攻势。 2月1日&#xff0c;据外媒Cryptoslate报道&#xff0c;贝莱德在提交给美国SEC的一份文件中显示&#xff0c;其提出一项在建筑物侧面投影比特币ETF广告计划。 据介绍&#xff0c;广告内容为&#xff1a;「IBIT」信号是一个以迈阿…

【Qt+MSVC2017_64bit +Cmake新建项目编译出错】

项目场景&#xff1a; 提示&#xff1a;这里简述项目相关背景&#xff1a; 项目新电脑环境配置 QtMSVC2017_64bit Cmake新建项目编译出错 问题描述 提示&#xff1a;这里描述项目中遇到的问题&#xff1a; QtMSVC2017_64bit Cmake新建项目编译出错 Running C:\Program Fil…

【数据分享】1米分辨率土地覆盖数据集SinoLC-1

数据链接 SinoLC-1: the first 1-meter resolution national-scale land-cover map of China created with the deep learning framework and open-access data (Update data: August, 2023) (zenodo.org)https://zenodo.org/records/8214467 数据分享 数据分享到了公众号&…

Android studio改代码运行不生效

Android studio改代码后运行不生效&#xff0c;尝试卸载apk后&#xff0c;运行能生效&#xff0c;后面尝试手动通过adb命令安装生成的apk能生效。 studio 版本 解决方案&#xff1a; 在File->Settings->Build, Execution, Deployment&#xff0c;找到Android Configura…

BFS——双向广搜+A—star

有时候从一个点能扩展出来的情况很多&#xff0c;这样几层之后搜索空间就很大了&#xff0c;我们采用从两端同时进行搜索的策略&#xff0c;压缩搜索空间。 190. 字串变换(190. 字串变换 - AcWing题库) 思路&#xff1a;这题因为变化规则很多&#xff0c;所以我们一层一层往外…

golang开源的可嵌入应用程序高性能的MQTT服务

golang开源的可嵌入应用程序高性能的MQTT服务 什么是MQTT&#xff1f; MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;是一种轻量级的、开放的消息传输协议&#xff0c;设计用于在低带宽、高延迟或不可靠的网络环境中进行通信。MQTT最初由IBM开发&#xf…

canvas设置图形各种混合模式,类似photoshop效果

查看专栏目录 canvas实例应用100专栏&#xff0c;提供canvas的基础知识&#xff0c;高级动画&#xff0c;相关应用扩展等信息。canvas作为html的一部分&#xff0c;是图像图标地图可视化的一个重要的基础&#xff0c;学好了canvas&#xff0c;在其他的一些应用上将会起到非常重…

一看就会《幻兽帕鲁》服务器自建指南

玩转幻兽帕鲁服务器&#xff0c;阿里云推出新手0基础一键部署幻兽帕鲁服务器教程&#xff0c;傻瓜式一键部署&#xff0c;3分钟即可成功创建一台Palworld专属服务器&#xff0c;成本仅需26元&#xff0c;阿里云服务器网aliyunfuwuqi.com分享2024年新版基于阿里云搭建幻兽帕鲁服…