学习记录:js算法(一百零六):最长回文子串

文章目录

    • 最长回文子串
      • 思路一

最长回文子串

给你一个字符串 s,找到 s 中最长的回文子串

示例 1:
输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。示例 2:
输入:s = "cbbd"
输出:"bb"

思路一

var longestPalindrome = function(s) {const n = s.length;if (n < 2) return s; // 字符串长度小于2,直接返回原字符串let start = 0, maxLength = 1; // 初始化最长回文子串的起始位置和最大长度const dp = new Array(n); // 初始化dp数组,dp[i]表示以i为中心的最长回文子串的真正半径// 遍历每一个字符作为回文中心for (let i = 0; i < n; i++) {// 奇数长度回文子串,以i为中心dp[i] = expandAroundCenter(s, i, i);// 偶数长度回文子串,以i和i+1为中心if (i + 1 < n) {const len2 = expandAroundCenter(s, i, i + 1);dp[i + 1] = len2; // 注意这里更新dp[i+1],因为偶数长度的回文串的"中心"可以认为是i+1}// 更新最长回文子串的信息if (dp[i] > maxLength) {maxLength = dp[i];start = i - Math.floor((dp[i] - 1) / 2);}if (i + 1 < n && dp[i + 1] > maxLength) {maxLength = dp[i + 1];start = i + 1 - Math.floor(dp[i + 1] / 2);}}// 根据起始位置和最大长度截取最长回文子串return s.substring(start, start + maxLength);
};// 辅助函数,围绕中心扩展寻找回文串
function expandAroundCenter(s, left, right) {while (left >= 0 && right < s.length && s[left] === s[right]) {left--;right++;}return right - left - 1; // 返回回文串的长度
}

讲解
动态规划在这里的关键是将问题分解为较小的子问题,并利用已解决的子问题结果来构建更大的解。对于寻找最长回文子串的问题,我们可以遵循以下步骤:

  1. 初始化:
    ○ 首先,初始化一个一维或二维的动态规划数组。对于一维DP方法,数组的长度与原字符串相同,每个元素表示以其索引为中心的最长回文子串的半径。
    ○ 初始化最长回文子串的起始位置和最大长度,通常起始位置设为0,长度设为1(单个字符本身就是最短的回文子串)。
  2. 状态定义:
    ○ 设dp[i]表示以索引i为中心的最长回文子串的半径(对于奇数长度的回文)或实际长度减1(对于偶数长度的回文,想象一个虚拟中心位于两个字符之间)。
  3. 状态转移方程:
    ○ 对于每个中心,尝试向两边扩展,直到遇到不匹配的字符为止。利用已计算的子串信息来避免重复计算。
    ○ 对于奇数长度的回文,中心是单一字符,检查s[i-(dp[i]-1)]和s[i+(dp[i]-1)]是否相等。
    ○ 对于偶数长度的回文,中心位于两个字符间,检查s[i-(dp[i]+1)/2]和s[i+(dp[i]+1)/2]是否相等。
  4. 遍历和更新:
    ○ 遍历字符串中的每个字符,对每个字符应用上述状态转移方程,更新最长回文子串的信息(起始位置和最大长度)。
  5. 结果提取:
    ○ 根据最终的最长回文子串的起始位置和最大长度,从原字符串中截取这个子串并返回。

通过这种分而治之的策略,我们能够在每个字符上计算出以它为中心的最长回文子串信息,进而找到整个字符串中的最长回文子串。这种方法相比暴力解法大大提高了效率,尤其是通过空间优化使用一维数组时,既保持了问题解决的高效性,又降低了空间复杂度。

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

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

相关文章

JWT介绍和结合springboot项目实践(登录、注销授权认证管理)

目录 一、JWT介绍&#xff08;一&#xff09;基本介绍&#xff08;二&#xff09;jwt有哪些库1、jjwt&#xff08;Java JWT&#xff09;2、nimbus - jwt - jwt - api 和 nimbus - jwt - jwt - impl3、spring - security - jwt&#xff08;已弃用&#xff0c;但在旧项目中有参考…

frp软件实现网络穿透

1. 名词 1.1. 网络穿透 网络穿透是一种技术&#xff0c;用于解决内网设备或服务无法直接被外部网络访问的问题。通常&#xff0c;内网设备位于路由器后面&#xff0c;并没有公网 IP 地址&#xff0c;因此外部用户不能直接连接到这些设备。网络穿透通过一些特定的技术手段&…

leetcode3250. 单调数组对的数目 I,仅需1s

题目&#xff1a; https://leetcode.cn/problems/find-the-count-of-monotonic-pairs-i/description/ 不为别的&#xff0c;只是记录下这个超过100%&#xff0c;而且比原先最快的快了一个量级 不知道咋分析&#xff0c;反正得出结论就是&#xff0c;变大不变&#xff0c;变小…

使用docker-compose部署搜索引擎ElasticSearch6.8.10

背景 Elasticsearch 是一个开源的分布式搜索和分析引擎&#xff0c;基于 Apache Lucene 构建。它被广泛用于实时数据搜索、日志分析、全文检索等应用场景。 Elasticsearch 支持高效的全文搜索&#xff0c;并提供了强大的聚合功能&#xff0c;可以处理大规模的数据集并进行快速…

Zabbix 模板翻译自动化教程

在企业 IT 运维管理中&#xff0c;Zabbix 作为一款强大的开源监控平台被广泛应用。而 Zabbix 模板作为监控配置的重要组成部分&#xff0c;用来定义监控项、触发器、图形等。随着国际化的需求增加&#xff0c;Zabbix 模板的翻译工作变得日益重要&#xff0c;特别是在需要为不同…

Springboot小知识(1):启动类与配置

一、启动类&#xff08;引导类&#xff09; 在通常情况下&#xff0c;你创建的Spring应用项目都会为你自动生成一个启动类&#xff0c;它是这个应用的起点。 在Spring Boot中&#xff0c;引导类&#xff08;也称为启动类&#xff0c;通常是main方法所在的类&#xff09;是整个…

JavaScript 高级教程:异步编程、面向对象与性能优化

在前两篇教程中&#xff0c;我们学习了 JavaScript 的基础和进阶内容。这篇文章将带领你进入更深层次&#xff0c;学习 JavaScript 的异步编程模型、面向对象编程&#xff08;OOP&#xff09;&#xff0c;以及性能优化的技巧。这些内容对于构建复杂、流畅的前端应用至关重要。 …

uniapp手机端一些坑记录

关于 z-paging-x 组件&#xff0c;在ios上有时候通过弹窗去粗发它reload时会触发闪退&#xff0c;可能是弹框插入进去导致的DOM 元素已经被移除或者不可用&#xff0c;解决办法是加上他自带属性 :showRefresherWhenReload"true" 加上showRefresherWhe…

数据集-目标检测系列- 海边漫步锻炼人检测数据集 person >> DataBall

数据集-目标检测系列- 海边漫步锻炼人检测数据集 person >> DataBall DataBall 助力快速掌握数据集的信息和使用方式&#xff0c;会员享有 百种数据集&#xff0c;持续增加中。 需要更多数据资源和技术解决方案&#xff0c;知识星球&#xff1a; “DataBall - X 数据球…

NLP信息抽取大总结:三大任务(带Prompt模板)

信息抽取大总结 1.NLP的信息抽取的本质&#xff1f;2.信息抽取三大任务&#xff1f;3.开放域VS限定域4.信息抽取三大范式&#xff1f;范式一&#xff1a;基于自定义规则抽取&#xff08;2018年前&#xff09;范式二&#xff1a;基于Bert下游任务建模抽取&#xff08;2018年后&a…

手机中的核心SOC是什么?

大家好&#xff0c;我是山羊君Goat。 常常听说CPU&#xff0c;中央处理器等等的&#xff0c;它是一个电脑或单片机系统的核心&#xff0c;但是对于SOC可能相比于CPU了解的人没有那么广泛。 所以SOC是什么&#xff1f; SOC全称是System on Chip&#xff0c;就是片上系统&#…

网络--socket编程--基础

1、网络字节序 已知:内存中的很多数据都有大小端之分,在网络这,网络数据流也是有大小端之分的。 TCP/IP协议规定:网络数据流采用大端字节序(即低地址处放高位字节)。 因此,小端机器发送网络数据流之前,必须转为大端(一般的机器会自动转换): 在网络-本地字节序转换…

Transformers在计算机视觉领域中的应用【第1篇:ViT——Transformer杀入CV界之开山之作】

目录 1 模型结构2 模型的前向过程3 思考4 结论 论文&#xff1a; AN IMAGE IS WORTH 16X16 WORDS: TRANSFORMERS FOR IMAGE RECOGNITION AT SCALE 代码&#xff1a;https://github.com/google-research/vision_transformer Huggingface&#xff1a;https://github.com/huggingf…

<数据集>路面坑洼识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;665张 标注数量(xml文件个数)&#xff1a;665 标注数量(txt文件个数)&#xff1a;665 标注类别数&#xff1a;1 标注类别名称&#xff1a;[pothole] 序号类别名称图片数框数1pothole6651740 使用标注工具&#x…

IDEA的简易安装思路

IDEA(本身就是Java开发的)&#xff1a;是目前为止开发Java效率最高的工具&#xff0c;但正版收费……&#xff08;eclipse的话不好说&#xff0c;反正还是随主流吧&#xff09; 使用IDEA的前提&#xff1a;必须先安装JDK【否则直接使用IDEA工具来运行程序是无效的&#xff0c;它…

PySide6 QSS(Qt Style Sheets) Reference: PySide6 QSS参考指南

Qt官网参考资料&#xff1a; QSS介绍&#xff1a; Styling the Widgets Application - Qt for Pythonhttps://doc.qt.io/qtforpython-6/tutorials/basictutorial/widgetstyling.html#tutorial-widgetstyling QSS 参考手册&#xff1a; Qt Style Sheets Reference | Qt Widge…

07.ES11 08.ES12

7.1、Promise.allSettled 调用 allsettled 方法&#xff0c;返回的结果始终是成功的&#xff0c;返回的是promise结果值 <script>//声明两个promise对象const p1 new Promise((resolve, reject) > {setTimeout(() > {resolve("商品数据 - 1");}, 1000)…

qt QGraphicsRotation详解

1、概述 QGraphicsRotation 是 Qt 框架中 QGraphicsTransform 的一个子类&#xff0c;它专门用于处理图形项的旋转变换。通过 QGraphicsRotation&#xff0c;你可以对 QGraphicsItem&#xff08;如形状、图片等&#xff09;进行旋转操作&#xff0c;从而创建动态和吸引人的视觉…

【概率论】分布函数的定义与应用:从直观到数学形式

目录 1. 分布函数的直观引入1.1 从一个例子出发 1.2 累积分布与分布函数2. 分布函数的定义2.1 数学定义2.2 分布函数的图像 3. 分布函数的性质4. 离散型与连续型分布函数4.1 离散型分布函数4.2 连续型分布函数 5. 应用与计算5.1 由分布函数计算概率5.2 分布函数求导 6. 总结与展…

Unity Plane API解释

构造函数解释&#xff0c;d的解释为&#xff1a;距离是沿着平面法线从平面到原点的距离。注意&#xff0c;这意味着为正值的distance值将导致平面朝向原点。负的距离值会导致平面朝向远离原点。 试验&#xff1a; GetSide方法检测点是否位于平面的正向侧&#xff0c;结果显示…