JavaScript求解最长回文子串的方法分享

JS求解最长回文子串的方法分享:

一、前置知识

在学习JS求解最长回文子串之前,你需要掌握以下知识:

  1. 严格模式
  2. 回文字符串
  3. 动态规划

二、什么是回文字符串?

回文字符串是指正着读和倒着读都一样的字符串。例如,'level'、'racecar'、'rotor' 都是回文字符串。

三、求解最长回文子串的方法

对于字符串中的每一个字符,判断它和它往前的字符组成的子串是否是回文字符串,同时记录下最长的回文子串,最后返回最长回文子串的长度。

代码如下:

function longestPalindrome(s) {
    let maxLen = 0;
    let startIndex = 0;
    for (let i = 0; i < s.length; i++) {
        // 判断奇数长度的回文字符串
        let j = i - 1,
            k = i + 1;
        while (j >= 0 && k < s.length && s[j] === s[k]) {
            if (k - j + 1 > maxLen) {
                maxLen = k - j + 1;
                startIndex = j;
            }
            j--;
            k++;
        }
        // 判断偶数长度的回文字符串
        j = i,
        k = i + 1;
        while (j >= 0 && k < s.length && s[j] === s[k]) {
            if (k - j + 1 > maxLen) {
                maxLen = k - j + 1;
                startIndex = j;
            }
            j--;
            k++;
        }
    }

    return s.substr(startIndex, maxLen);
}

示例说明:

  • 示例一
console.log(longestPalindrome('babad')) // 'bab'

对于字符串 'babad',最长的回文子串分别是 'bab' 和 'aba',返回其中一个即可。

  • 示例二:
console.log(longestPalindrome('cbbd')) // 'bb'

对于字符串 'cbbd',最长的回文子串是 'bb',直接返回即可。

四、动态规划算法

以上算法的时间复杂度为 $O(n^2)$,还存在一种 $O(n^2)$ 算法,即动态规划算法。

动态规划算法思路和上面的算法一样,但是会多存储一个 $n * n$ 的二维数组 dp 用来记录状态转移,具体实现可参考下面的代码。

function longestPalindromeDP(s) {
    let len = s.length;
    let dp = Array.from({ length: len }, () => Array.from({ length: len }).fill(false));
    let startIndex = 0;
    let maxLen = 1;

    // 初始化单字符和双字符的回文串
    for (let i = 0; i < len; i++) {
        dp[i][i] = true;
        if (i < len - 1 && s[i] === s[i + 1]) {
            dp[i][i + 1] = true;
            maxLen = 2;
            startIndex = i;
        }
    }

    // 补充左下角的残缺部分即j-i小于2时的情况
    for (let i = len - 3; i >= 0; i--) {
        for (let j = i + 2; j < len; j++) {
            dp[i][j] = dp[i + 1][j - 1] && s[i] === s[j];
            if (dp[i][j] && j - i + 1 > maxLen) {
                maxLen = j - i + 1;
                startIndex = i;
            }
        }
    }

    return s.substr(startIndex, maxLen);
}

五、总结

本文主要介绍了 JS 求解最长回文子串的方法,主要采用了中心扩展和动态规划两种算法,希望对大家有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript求解最长回文子串的方法分享 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • JS实现数组随机排序的三种方法详解

    JS实现数组随机排序的三种方法详解 在JavaScript中,实现数组的随机排序是十分常见的需求。本篇文章将讲解三种实现数组随机排序的方法。 方法一:Fisher-Yates算法 Fisher-Yates算法(也被称为 Knuth算法)是实现数组随机排序最常用的算法之一。该算法的思路很简单,即从数组末尾开始,将当前位置的数与它之前的任意一个数交换顺序,直到数…

    算法与数据结构 2023年5月19日
    00
  • 前端JavaScript多数元素的算法详解

    前端JavaScript多数元素的算法详解 算法介绍 多数元素在一个数组中出现次数超过一半的元素,因此要找到多数元素,需要考虑其出现次数是否超过了数组长度的一半。本文介绍三种常见的多数元素算法,分别为排序法、哈希表法和摩尔投票法。 排序法 排序法的思路是先对数组进行排序,然后返回数组中间的那个元素即可。由于多数元素出现次数超过了数组长度的一半,因此排序后中间…

    算法与数据结构 2023年5月19日
    00
  • C/C++浅析邻接表拓扑排序算法的实现

    C/C++浅析邻接表拓扑排序算法的实现 什么是拓扑排序 在图论中,若存在一种拓扑序列,使得对于任意的有向边(u,v),u在序列中都在v的前面,则称该图为拓扑排序,该序列称为拓扑序列。拓扑排序是一个有向无环图(DAG, Directed Acyclic Graph)的一种线性序列。 拓扑排序算法的实现 拓扑排序算法的实现一般基于邻接表,其核心思路为:先将所有入…

    算法与数据结构 2023年5月19日
    00
  • PHP排序算法类实例

    让我先给出该攻略的大纲: 算法类的设计思路 冒泡排序算法示例 快速排序算法示例 使用算法类进行排序 接下来,我将详细讲解每一步内容。 1. 算法类的设计思路 首先,我们需要为排序算法创建一个类,这个类应该包含常见排序算法的实现函数。这些函数应该是静态函数,以便我们可以直接访问它们,而不必实例化排序类。 我们还需要实现一些通用的辅助函数,这些函数可以在算法函数…

    算法与数据结构 2023年5月19日
    00
  • 京东在数据挖掘方面对推荐技术的优化

    京东在数据挖掘方面对推荐技术的优化 京东是中国著名的电商平台,一直在推进自己的推荐系统技术,以提高用户交互体验和推广效果。在数据挖掘方面,京东对推荐技术进行了一系列的优化,包括以下几个方面: 1. 数据收集和处理 京东首先通过大数据技术收集和整理用户的行为数据,包括购买、浏览、评价等多个方面。同时利用机器学习技术进行数据建模,包括对用户画像、商品描述等方面的…

    算法与数据结构 2023年5月19日
    00
  • Golang实现四种负载均衡的算法(随机,轮询等)

    Golang实现四种负载均衡的算法(随机,轮询等) 负载均衡是指在分布式系统中,将工作负载分摊到多个计算资源来进行共同处理的技术。 Golang作为一种高性能、可靠性语言,天然适合做负载均衡,因此我们可以用Golang实现四种常用的负载均衡算法。 什么是负载均衡算法? 负载均衡算法是指在分发服务时,选择合适的服务器来处理请求的一种算法。负载均衡可分为静态负载…

    算法与数据结构 2023年5月19日
    00
  • C#递归算法之分而治之策略

    C#递归算法之分而治之策略 简介 递归算法是一种非常重要的算法,使用递归算法可以解决很多复杂的问题。分而治之是一种常用的递归思路,即将一个问题分成若干个子问题,分别解决,然后将它们的解合并起来得到原问题的解。 分而治之策略 分而治之策略就是将一个复杂的问题分成若干个相同或相似的子问题,并且逐个解决这些子问题,最后统合起来得到原问题的解。这种算法适用于一些可分…

    算法与数据结构 2023年5月19日
    00
  • C#实现希尔排序

    C#实现希尔排序攻略 简介 希尔排序(Shell Sort)是插入排序的一种改进版本,也称为缩小增量排序(Diminishing Increment Sorting)。希尔排序首先将要排序的序列分成若干个子序列,分别进行插入排序,待子序列基本有序时,再对全体记录进行一次直接插入排序。其算法主要思想是将原序列按一定间隔分为若干子序列,对每个子序列分别进行插入排…

    算法与数据结构 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部