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日

相关文章

  • Go归并排序算法的实现方法

    Go归并排序算法的实现方法 简介 归并排序(Merge Sort)是一种经典的分治算法,它将一个大问题分解为若干个小问题,通过递归将小问题排好序,最后再将小问题合并起来,得到排序的结果。 归并排序的最坏时间复杂度为$ O(nlogn)$,且具有稳定性,是较为优秀的排序算法之一。 实现方法 归并排序的实现分为两个步骤,分别是分解和合并: 分解 分解过程需要递归…

    算法与数据结构 2023年5月19日
    00
  • c语言实现基数排序解析及代码示例

    c语言实现基数排序解析及代码示例 前言 基数排序是一种特殊的排序算法,它的时间复杂度为O(dn),其中d表示数据位数,n表示数据个数。它可以用于排序整数、字符串、链表等数据类型。本篇攻略通过讲解基数排序的原理、流程和C语言实现,希望能够帮助大家更好地理解和应用基数排序算法。 基数排序原理 基数排序是一种非比较排序算法,它的实现基于按照键值的每位数字对待排序数…

    算法与数据结构 2023年5月19日
    00
  • java实现波雷费密码算法示例代码

    Java实现波雷费密码算法的步骤如下: 首先,下载并添加bcprov-jdk15on-168.jar的BouncyCastle加密库。下载地址:https://www.bouncycastle.org/latest_releases.html 打开Java IDE,并新建一个Java项目。 在项目中创建一个新的Java类,并将其命名为“BlowfishCip…

    算法与数据结构 2023年5月19日
    00
  • c++ 快速排序算法【过程图解】

    C++ 快速排序算法【过程图解】 快速排序是一种常用的排序算法,其基本原理是通过分治的思想将待排序序列分成若干子序列,使得每个子序列都是有序的。具体实现时,首先选择一定的元素作为基准值,然后将比基准值小的元素全部放在基准值的左边,比基准值大的元素全部放在基准值的右边,这样就将序列分成了分别包含较小元素和较大元素的两个子序列。然后,递归地对子序列进行排序,最终…

    算法与数据结构 2023年5月19日
    00
  • JS实现常见的查找、排序、去重算法示例

    JS实现常见的查找、排序、去重算法示例 在 JavaScript 中,常见的算法题目也非常多,其中最常见的算法大致可以分为三类,即查找、排序和去重。在这里将对这三个方面中比较常用的算法进行一一解析,以期能够帮助大家更好的理解和掌握这些算法的使用。 一、查找 1. 二分查找 在排序好的数组中查找一个值,如何快速地找到这个值呢?这时候可以使用二分查找算法。它的原…

    算法与数据结构 2023年5月19日
    00
  • Golang算法问题之数组按指定规则排序的方法分析

    下面是“Golang算法问题之数组按指定规则排序的方法分析”的完整攻略: 前言 数组排序是算法问题的一个经典案例,今天将介绍如何使用 Go 语言对数组按照指定规则排序的方法。 算法分析 冒泡排序 冒泡排序是一种非常经典的排序算法,其基本思想是重复地走访过要排序的元素列,每次比较相邻的两个元素,如果它们的顺序错误就交换它们的位置。具体实现方式如下: func …

    算法与数据结构 2023年5月19日
    00
  • C语言完整实现12种排序算法(小结)

    C语言完整实现12种排序算法(小结) 本文主要介绍了C语言实现12种排序算法的详细过程以及相关示例。 排序算法的分类 排序算法可分为内部排序和外部排序。内部排序是指将待排序的数据全部加载到内存中进行排序,而外部排序是指在数据量过大时需要将数据分块,对每一块数据进行排序,最后将各个块合并起来,得到有序的结果。 在内部排序中,常用的排序算法大致可分为以下几类: …

    算法与数据结构 2023年5月19日
    00
  • js交换排序 冒泡排序算法(Javascript版)

    JavaScript冒泡排序算法 算法描述 冒泡排序(Bubble Sort)是一种简单的排序算法。它重复地遍历要排序的序列,一次比较相邻的两个元素,如果它们的顺序错误就将它们交换。遍历序列的工作是重复地进行直到没有再需要交换,也就是说该序列已经排序完成。 算法实现 JavaScript 代码 function bubbleSort(arr) { var l…

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