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日

相关文章

  • Java 堆排序实例(大顶堆、小顶堆)

    下面我将为您介绍 Java 堆排序实例(大顶堆、小顶堆)的完整攻略。 1. 堆排序介绍 堆排序是一种树形选择排序方法,它的特点是将数组看成一棵完全二叉树,然后通过建立堆(一种特殊的完全二叉树),逐个取出堆顶元素并重新建堆的过程来进行排序。具体来说,堆排序可以分为两种:大顶堆排序和小顶堆排序。 在大顶堆排序中,堆顶元素最大,从小到大进行排序;在小顶堆排序中,堆…

    算法与数据结构 2023年5月19日
    00
  • C语言超详细讲解排序算法上篇

    C语言超详细讲解排序算法上篇 简介 本文将介绍排序算法的基础知识和常见排序算法,包括冒泡排序、选择排序、插入排序。 排序算法是计算机科学中非常重要的算法之一,在实际开发中也经常用到。了解各种排序算法的特点和优缺点,可以帮助我们更好地应对实际问题。 基础知识 在介绍排序算法之前,有一些基础知识需要了解。 1. 时间复杂度 时间复杂度用来衡量一个算法所需要的计算…

    算法与数据结构 2023年5月19日
    00
  • MybatisPlus中的insert操作详解

    MybatisPlus 是 MyBatis 的增强工具包,可以极大地简化 MyBatis 的操作。其中包括许多基础操作,例如insert、update、delete、select等操作。在这里,我们将详细讲解 MybatisPlus 中的 insert 操作。 什么是 MybatisPlus 中的 insert 操作? MybatisPlus 中的 inse…

    算法与数据结构 2023年5月19日
    00
  • php计数排序算法的实现代码(附四个实例代码)

    php计数排序算法的实现代码 是什么? 计数排序是一种线性时间复杂度的排序算法,该算法的核心思想是对每个输入元素统计出小于该元素的元素个数,根据此信息可以直接确定每个元素在排序后数组中的位置。在实现过程中需要开辟一定的内存空间来存储统计的数据。 php计数排序算法的实现代码 的思路是什么? 创建一个计数数组counts,长度为maxValue+1,maxVa…

    算法与数据结构 2023年5月19日
    00
  • JAVA中数组从小到大排序的2种方法实例

    JAVA中数组从小到大排序的2种方法实例 在Java中,对数组进行排序是一项常见的任务。本文将介绍Java中数组从小到大排序的两种方法。 方法一:使用Arrays.sort()方法 Arrays.sort()方法可用于对Java中的数组进行排序。排序之后,数组中的元素将按升序排列。 以下是示例代码: import java.util.Arrays; publ…

    算法与数据结构 2023年5月19日
    00
  • 排序算法图解之Java插入排序

    首先要了解什么是插入排序,插入排序是排序算法中简单直观的一种,其原理是将未排序的元素一个一个插入到已经排好序的元素中,最终得到一个有序的序列。那么下面我将用Java代码来演示插入排序的实现过程,并且提供详细的注释帮助读者理解。 算法步骤 从第一个元素开始,认为第一个元素是已经排好序的,取第二个元素和已排序的元素进行比较,如果第二个元素比已排序的元素小,则交换…

    算法与数据结构 2023年5月19日
    00
  • asp下几种常用排序算法

    我将为您详细讲解ASP下几种常用排序算法的完整攻略。 一、排序算法简介 排序算法是计算机科学中非常基础的算法之一。它是将一组数据中的元素按照某种规则进行排序的过程。排序算法是计算机程序设计的基础,它涉及到数据结构、算法、模式识别等计算机科学领域内的基础理论。 排序算法主要分为以下几种: 冒泡排序 选择排序 插入排序 快速排序 归并排序 本文将针对ASP下几种…

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

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

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