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

方法一

使用双指针配合枚举

/**
 * @param {string} s
 * @return {string}
 */
const longestPalindrome = s => {
  const LEN = s.length
  if (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.length
  if (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 - 1
      if (r >= LEN) {
        break
      }
      if (s[l] === s[r]) {
        // 左指针与右指针中间最多为1个的时候可以直接判定为true, ABA 或者 aa
        if (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.length
  if (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 或者 aa
        if (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。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

福德植保无人机:农业科技的未来已来

一、引言 随着科技的不断进步&#xff0c;无人机技术已经深入到各个领域。而在农业领域&#xff0c;福德植保无人机更是引领了科技潮流&#xff0c;为农业生产带来了革命性的改变。今天&#xff0c;让我们一起来了解福德植保无人机的魅力所在。 二、福德植保无人机的优势 高效作…

elasticsearch操作

目录 一、mapping映射属性二、索引库的CRUD2.1 创建索引库和映射2.2 查询索引库2.3 修改索引库2.4 删除索引库2.5 总结 三、文档操作3.1 新增文档3.2 查询文档3.3 删除文档3.4 修改文档3.5 总结 四、RestClient操作索引库4.1 初始化RestClient4.2 创建索引库4.3 删除索引库4.4 …

记录一次现网问题排查(分享查域名是否封禁小程序)

背景&#xff1a; 收到工单反馈说现网业务一个功能有异常&#xff0c;具体现象是tc.hb.cn域名无法访问&#xff0c;客户地区是河南省&#xff0c;这里记录下排查过程和思路。 首先梳理链路 客户端域名 tc.hb.cn cname—> domainparking-dnspod.cn(新加坡clb)—> snat—&…

Docker中Alpine容器中配置MariaDB

1.更新镜像源 apk update2.安装 Mysql apk add --no-cache mysql mysql-client # 安装命令也可使用 apk add mariadb mariadb-client&#xff0c;alpine 中 mysql 就是 mariadb3. 安装openrc openrc是Alpine服务控制器&#xff0c;负责Alpine服务启动&#xff0c;添加、删除…

【开源视频联动物联网平台】为什么需要物联网网关?

在一些物联网项目中&#xff0c;物联网网关这一产品经常被涉及。那么&#xff0c;物联网网关究竟有何作用&#xff1f;具备哪些功能&#xff1f;同时&#xff0c;我们也发现有些物联网设备并不需要网关。那么&#xff0c;究竟在何时需要物联网网关呢&#xff1f; 物联网的架构…

微调技术是LLM大模型增强的有效方案?

▼最近直播超级多&#xff0c;预约保你有收获 近期直播&#xff1a;《大模型Transformer架构剖析以及微调应用实战》 —1— 为什么要对 LLM 大模型增强&#xff1f; GPT 4 Turbo 大模型在理解、生成、逻辑、记忆等多个通用能力维度方面具备斯坦福毕业生的能力水平&#xff0c;…

人工智能_机器学习055_拉格朗日乘子法_拉格朗日乘数法的原理介绍_流程详解---人工智能工作笔记0095

上一节我们已经演示了把SVM支持向量机的分割线,画出来,并且,我们也推导了SVM支持向量机的公式,但是支持向量机的公式,是带有条件的对吧,带有条件就算起来比较麻烦 可以看到现在我们要可以用,拉格朗日乘数法,将 有等式约束条件的优化问题 转换为 无约束优化问题,把有条件转换为…

网易区块链,网易区块链赋能赣州脐橙数字藏品,数字指纹解决方案

目录 网易区块链 网易区块链赋能赣州脐橙数字藏品,助力革命老区三农之路 数字指纹解决方案 网易区块链 网易区块链成立于2017年,致力于Web3.0区块链技术的研发和应用。自主研发的区块链“天玄”引擎,在单链场景下支持每秒最高30万笔交易,单日可处理上链数据超10亿。 与…

OSG编程指南<十四>:OSG纹理渲染之普通纹理、多重纹理、Mipmap多级渐远纹理及TextureRectangle矩阵纹理

1、纹理映射介绍 物体的外观不仅包括形状&#xff0c;不同物体表面有着不同的颜色和图案。一个简单而有效地实现这种特性的方法就是使用纹理映射。在三维图形中&#xff0c;纹理映射&#xff08;Texture Mapping&#xff09;的方法运用广泛&#xff0c;使用该技术可以大大提高物…

flink源码分析之功能组件(四)-slotpool组件I

简介 本系列是flink源码分析的第二个系列&#xff0c;上一个《flink源码分析之集群与资源》分析集群与资源&#xff0c;本系列分析功能组件&#xff0c;kubeclient&#xff0c;rpc&#xff0c;心跳&#xff0c;高可用&#xff0c;slotpool&#xff0c;rest&#xff0c;metrics&…

什么是供应链攻击?

随着企业越来越依赖技术、连接性和第三方&#xff0c;供应链攻击变得越来越普遍。这些攻击旨在通过供应商和业务合作伙伴损害公司。 供应链攻击可能对企业和组织构成重大威胁&#xff0c;损害其安全以及向客户提供的产品和服务的安全。 在本文中&#xff0c;我们将探讨供应链…

稳定的音频来了 — 使用人工智能创作音乐(for free)

今天&#xff0c;以稳定扩散&#xff08;Stable Diffusion&#xff09;和StableLM等开源AI工具和模型而闻名的Stability AI公司推出了其首个音乐和声音生成AI产品——StableAudio。音乐产业以其难以打入而闻名。即使您拥有才华和动力&#xff0c;您仍然需要创作和制作音乐所需的…

AppDelete 4.3.3(软件清理卸载工具)

AppDelete for Mac是一款运行在Mac平台上的强大软件卸载工具&#xff0c;AppDelete Mac版不仅可以删除应用程序&#xff0c;还可以删除小部件&#xff0c;首选项窗格&#xff0c;插件和屏幕保护程序及其相关文件&#xff0c;卸载快速又干净&#xff0c;仅需要简单的拖拽即可。 …

WEB渗透—反序列化(九)

Web渗透—反序列化 课程学习分享&#xff08;课程非本人制作&#xff0c;仅提供学习分享&#xff09; 靶场下载地址&#xff1a;GitHub - mcc0624/php_ser_Class: php反序列化靶场课程&#xff0c;基于课程制作的靶场 课程地址&#xff1a;PHP反序列化漏洞学习_哔哩哔_…

编程中常见的技术难题——如何有效地解决编程中常见的技术难题?

文章目录 前言编程的重要性编程中常见的技术难题新手编程常见问题一、变量的命名规范二、语法错误三、逻辑错误四、代码复用五、代码优化 解决技术难题的方法后记 前言 在编写程序的过程中&#xff0c;总会遇到各种各样的技术难题&#xff0c;这些问题常常需要程序员们耗费大量…

面试题:海量PDF的OCR处理思路

关键点&#xff1a; 1000wPDF&#xff1a;数据量非常大。3天处理完&#xff1a;有时间限制。一篇PDF1~10s&#xff1a;可能需要以最高10s去做计算&#xff0c;这样时间才能保证留有富余。要求资源最大化利用&#xff1a;也就是尽可能节省服务器资源&#xff0c;能复用尽量复用&…

NB-IoT BC260Y Open CPU SDK⑤点亮一个LED

NB-IoT BC260Y Open CPU SDK⑤点亮一个LED 1、BC260Y gpio资源介绍2、相关API介绍3、调试信息串口打印3、实例分析 本章节将介绍BC260Y硬件GPIO相关操作 1、BC260Y gpio资源介绍 BC260Y-AA的sdk包中官方给出了16个可用IO 在ql_gpio.h文件中有定义如下/**********************…

SpringCloud原理】OpenFeign之FeignClient动态代理生成原理

大家好&#xff0c;前面我已经剖析了OpenFeign的动态代理生成原理和Ribbon的运行原理&#xff0c;这篇文章来继续剖析SpringCloud组件原理&#xff0c;来看一看OpenFeign是如何基于Ribbon来实现负载均衡的&#xff0c;两组件是如何协同工作的。 一、Feign动态代理调用实现rpc流…

并查集带权并查集

定义 : 并查集 : 一种数据结构&#xff0c;用于处理一些不相交集合的合并与查询问题&#xff1b; 例题 : 如 : 有n种元素&#xff0c;分属于不同的n个集合&#xff1b; 有两种操作 : 1.给出两个元素的亲属关系&#xff0c;合并两个集合(x与y是亲戚&#xff0c;亲戚的亲戚…

基于Java SSM框架+Vue实现实现大学生企业推荐网站项目【项目源码+论文说明】

基于java的SSM框架Vue实现大学生企业推荐网站演示 摘要 大学生企业推荐系统采用B/S结构、java开发语言、以及Mysql数据库等技术。系统主要分为管理员和学生、企业三部分&#xff0c;管理员主要功能包括&#xff1a;首页、个人中心、学生管理、企业管理、招聘信息管理、个人简历…