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日

相关文章

  • C语言中的结构体快排算法

    C语言中的结构体快排算法 在C语言中,复杂的数据类型可以通过结构体定义。结构体是一种自定义类型,可以由不同类型的变量组成。快速排序算法是一种高效的排序算法,通过十分巧妙的算法思想,可以在平均$O(nlogn)$的时间复杂度内完成数组的排序。对于结构体类型的排序,在快速排序算法中也可以使用。本文主要讲解如何在C语言中使用结构体进行快排排序。 快速排序算法 快速…

    算法与数据结构 2023年5月19日
    00
  • 用c语言实现冒泡排序,选择排序,快速排序

    首先我们来讲一下三种基本的排序算法——冒泡排序、选择排序和快速排序,并且给出实现的具体代码。 冒泡排序 冒泡排序是一个非常简单的排序算法,其基本思想是比较相邻两个数的大小,如果前一个数比后一个数大,就将两个数交换位置。通过不断重复这个过程,将最大的数“冒泡”到数组的最后面,这个过程类似于水泡在水中不断冒上来,因此得其名。 具体的实现代码如下: void bu…

    算法与数据结构 2023年5月19日
    00
  • JavaScript实现数组全排列、去重及求最大值算法示例

    JavaScript实现数组全排列、去重及求最大值算法示例 实现数组全排列 数组的全排列即为将数组中所有元素进行全排列的结果。实现数组全排列的常用方法为回溯法。 回溯法的思想是从第一个元素开始,固定第一个元素,对于剩下的元素进行全排列,得到结果后将第一个元素与第二个元素交换,并对第二个元素之后的元素进行全排列,以此类推,直到最后一个元素,此时将所有的结果返回…

    算法与数据结构 2023年5月19日
    00
  • stl常用算法(Algorithms)介绍(stl排序算法、非变序型队列)

    STL常用算法介绍 STL(Standard Template Library)是C++标准库的一个庞大组成部分,提供了大量的常用算法,容器以及迭代器等等。这些工具都可以被拿来用来解决大部分的计算问题。其中stl常用算法主要包括排序算法和非变序型队列,下面进行详细讲解。 stl排序算法 STL提供了丰富的排序算法模板,可以直接拿来使用,无需重新实现。以下是一…

    算法与数据结构 2023年5月19日
    00
  • java实现图形卡片排序游戏

    以下是“Java实现图形卡片排序游戏”的完整攻略。这个游戏的目标是将打乱的卡片,按顺序排好。具体的操作方法是通过拖拽卡片,让卡片位置移动进行排序。 技术栈 Java语言 Swing GUI库 排序算法 功能设计 加载卡片图片及绑定事件处理方法 卡片随机化处理 拖拽移动卡片 实现移动时的动画效果 判断拼图是否按顺序排好 记录游戏步骤、分数等信息 具体实现 加载…

    算法与数据结构 2023年5月19日
    00
  • c++实现排序算法之希尔排序方式

    C++实现排序算法之希尔排序 前置知识 希尔排序是一种基于插入排序的排序算法 插入排序是一种简单直观的排序算法 算法思路 希尔排序是一种分组插入排序的算法。它的基本思想是:先将待排序序列按照一定规则分成若干子序列,对各个子序列进行插入排序,然后逐步缩小子序列的长度,最终使整个序列成为一个有序序列。 例如,对于一个序列 5 2 8 9 1 3 7 6 4,我们…

    算法与数据结构 2023年5月19日
    00
  • PHP数组递归排序实现方法示例

    当我们需要对 PHP 数组进行排序时,通常会使用 sort() 或者 usort() 函数,但这些函数只能对一维数组进行排序。当数组是多维结构时,我们需要使用递归的方式进行实现。 以下是一个 PHP 数组递归排序的示例实现: 定义待排序的数组 $student_scores = [ "class 1" => [ "Pete…

    算法与数据结构 2023年5月19日
    00
  • C语言实现数组元素排序方法详解

    C语言实现数组元素排序方法详解 概述 数组元素排序是C语言中常见的操作,它将数组中的元素按照一定的规则进行排序,使其符合特定的要求。常见的排序方法包括冒泡排序、插入排序、选择排序、快速排序等。 本文将详细讲解C语言实现数组元素排序的方法,包括上述四种排序方法的原理、代码实现,帮助初学者快速入门。 冒泡排序 冒泡排序是一种简单的排序方法,它依次比较相邻的两个元…

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