JS获取字符串里最长的回文字符串

方法一

使用双指针配合枚举

/*** @param {string} s* @return {string}*/
const longestPalindrome = s => {const LEN = s.lengthif (LEN < 2) {return s}let maxStr = ''/*** @param left * @param right * @returns */const findPalindrome = (left, right) => {while (left >= 0 && right < LEN && s[left] === s[right]) {left--right++}return s.substring(left + 1, right)}for (let i = 0; i < LEN; i++) {// 以i为中心判断是否是回文,如果回文是偶数则i和i+1为中心,负责i为中心。const strOdd = findPalindrome(i, i)const strEven = findPalindrome(i, i + 1)if (strEven.length > maxStr.length) {maxStr = strEven}if (strOdd.length > maxStr.length) {maxStr = strOdd}}return maxStr
}

方法二

动态规划+枚举

/*** @param {string} s */
const longestPalindrome1 = s => {const LEN = s.lengthif (LEN < 2) {return s}// 需要保证s[l]到s[r]为回文则s[l-1]到s[r+1]也是回文,通过二维数组记录lr的回文const dp = []for (let i = 0; i < LEN; i++) {dp[i] = new Array(LEN).fill(false)dp[i][i] = true}let maxStr = s[0]for (let palindromeLen = 2; palindromeLen <= LEN; palindromeLen++) {for (let l = 0; l < LEN; l++) {// 右指针指向的位置应该为左指针加回文串长度减一let r = l + palindromeLen - 1if (r >= LEN) {break}if (s[l] === s[r]) {// 左指针与右指针中间最多为1个的时候可以直接判定为true, ABA 或者 aaif (r - l <= 2) {dp[l][r] = true} else {dp[l][r] = dp[l + 1][r - 1]}} else {dp[l][r] = false}if (dp[l][r] && r - l + 1 > maxStr.length) {maxStr = s.substring(l, r + 1)}}}return maxStr
}

方法三

动态规划+双指针
在这里插入图片描述
s[l][r] 依赖 s[l+1][r-1],说明是依赖上层,所以需要把上层填满,所以r需要递增遍历固定r动l,且l需要小于r,相等的时候在初始化已经做好了。

  const LEN = s.lengthif (LEN < 2) {return s}// 需要保证s[l]到s[r]为回文则s[l-1]到s[r+1]也是回文,通过二维数组记录lr的回文const dp = []for (let i = 0; i < LEN; i++) {dp[i] = new Array(LEN).fill(false)dp[i][i] = true}let start = 0 , end = 0;// l必须小于r从第一层填起可以画三角,s[l]到s[r]依赖s[l-1]到s[r+1]for (let r = 1; r < LEN; r++) {for (let l = r - 1; l >= 0; l--) {if (s[l] === s[r]) {// 左指针与右指针中间最多为1个的时候可以直接判定为true, ABA 或者 aaif (r - l <= 2) {dp[l][r] = true} else {dp[l][r] = dp[l + 1][r - 1]}} else {dp[l][r] = false}if (dp[l][r] && r - l > end - start) {end = r;start = l;}}}return s.slice(start,end+1)

说明

方法一和方法二都可以采用start和end来记位置,最后再去拿到回文字符串。这样减少对字符串的截取,时间会更快。方法一如果记位置则需要改造获取回文的方法并且直接在回文内部去更新start和end。

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

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

相关文章

服务器数据恢复—V7000存储raid5崩溃导致上层卷无法使用的数据恢复案例

服务器数据恢复环境&#xff1a; 某品牌V7000存储中有一组由几十块硬盘组建的raid5阵列。上层操作系统为windows server&#xff0c;NTFS分区。 服务器故障&#xff1a; 有一块硬盘出现故障离线&#xff0c;热备盘自动上线替换离线硬盘。在热备盘上线同步数据的过程&#xff0c…

视频智能分析国标GB28181云平台EasyCVR加密机授权异常是什么原因?

国标GB28181视频汇聚/视频云存储/集中存储/视频监控管理平台EasyCVR能在复杂的网络环境中&#xff0c;将分散的各类视频资源进行统一汇聚、整合、集中管理&#xff0c;实现视频资源的鉴权管理、按需调阅、全网分发、云存储、智能分析等。 近期有用户选择使用加密机进行EasyCVR授…

kubernetes七层负载Ingress搭建(K8S1.23.5)

首先附上K8S版本及Ingress版本对照 Ingress介绍 NotePort&#xff1a;该方式的缺点是会占用很多集群机器的端口&#xff0c;当集群服务变多时&#xff0c;这个缺点就愈发的明显(srevice变多&#xff0c;需要的端口就需要多) LoadBalancer&#xff1a;该方式的缺点是每个servi…

linux用户组_创建_删除_修改

2.2.2 用户组 每个用户都有一个用户组&#xff0c;系统可以对一个用户组中的所有用户进行集中管理。不同Linux系统对用户组的规定有所不同&#xff0c;如Linux下的用户属于与它同名的用户组&#xff0c;这个用户组在创建用户时同时创建。 组的类型&#xff1a; 基本组&#x…

【Node.js】笔记整理 3 -npm

写在最前&#xff1a;跟着视频学习只是为了在新手期快速入门。想要学习全面、进阶的知识&#xff0c;需要格外注重实战和官方技术文档&#xff0c;文档建议作为手册使用 系列文章 【Node.js】笔记整理 1 - 基础知识【Node.js】笔记整理 2 - 常用模块【Node.js】笔记整理 3 - n…

机器学习模型验证——以数据为中心的方法

构建机器学习模型时&#xff0c;人们往往将激情和精力集中于收集数据和训练模型&#xff0c;对测试模型和验证结果往往缺少应有的关注。正确的验证技术有助于估计无偏见的广义模型的性能&#xff0c;并更好地理解模型训练的效果。您需要确保机器学习模型经过准确的训练&#xf…

游戏开发纪实——一款横板2d跑酷游戏是如何诞生的?

前不久&#xff0c;参加了学校游戏社团Nova独游社举办为期两周的GameJam&#xff0c;算是一段有点意思的经历&#xff0c;遂以本文记录如下。 GameJam是什么 GameJam是指游戏开发者聚集在一起&#xff0c;在有限的时间内合作创作游戏的活动。这种活动旨在通过短时间内集中精力…

re:Invent 构建未来:云计算生成式 AI 诞生科技新局面

文章目录 前言什么是云计算云计算类型亚马逊云科技云计算最多的功能最大的客户和合作伙伴社区最安全最快的创新速度最成熟的运营专业能力 什么是生成式 AI如何使用生成式 AI后记 前言 在科技发展的滚滚浪潮中&#xff0c;我们见证了云计算的崛起和生成式 AI 的突破&#xff0c…

什么是美颜sdk?集成第三方美颜sdk的步骤

本文将深入探讨如何集成第三方美颜sdk&#xff0c;为直播平台引入更先进、更具吸引力的美颜特效。 第一步&#xff1a;选择合适的第三方美颜sdk 在开始集成美颜sdk之前&#xff0c;首要任务是选择适合自己直播平台需求的第三方美颜sdk。不同的sdk可能具有不同的特色和性能&a…

rabbitmq-server-3.11.10.exe

rabbitmq需要erlang环境 otp_win64_25.1.exe erlang-CSDN博客 https://www.rabbitmq.com/download.htmlhttps://www.rabbitmq.com/install-windows.htmlhttps://github.com/rabbitmq/rabbitmq-server/releases/download/v3.11.10/rabbitmq-server-3.11.10.exe C:\Users\Admi…

Tomcat的安装及其使用

一.下载安装 本文下载的是8.5版本的&#xff0c;下载链接&#xff1a;Apache Tomcat - Welcome! 切记解压缩的目录不要有中文存在。 二.启动Tomcat 在解压缩之后&#xff0c;会有很多文件存在&#xff0c;但是我们只需要在意两个文件&#xff01; webapps 目录 . web applica…

阿里健康发布最新公告:收入129.6亿 获阿里妈妈医疗健康类目独家经营权

11月28日&#xff0c;阿里健康发布公告宣布&#xff0c;正式与阿里巴巴集团签署股权认购协议&#xff0c;以135.12亿港元对价&#xff0c;获得阿里妈妈医疗健康类目的独家营销审核权及附属权利。交易完成后&#xff0c;阿里巴巴集团对阿里健康的持股比例从56.99%上升到63.83%。…