【LeetCode】5. 最长回文子串 动态规划、中心扩展、马拉车算法 多解法详解

马拉车算法(C/C++) 是一种用于在字符串中查找最长回文子串的线性时间复杂度算法。该算法由Udi Manacher在1980年代提出,因此得名。它的核心思想是利用已知的回文信息来减少不必要的比较,从而提高效率。 阅读详情

【LeetCode】5. 最长回文子串

给你一个字符串 s,找到 s 中最长的回文子串。

示例 1:

输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。

示例 2:

输入:s = "cbbd"
输出:"bb"

提示:

  • 1 <= s.length <= 1000
  • s 仅由数字和英文字母组成

动态规划

  1. 确定dp含义:

​ dp[i] [j]表示:字符串s,以i下标开始,j下标结束,是不是回文

  1. 确定dp递推公式

​ 因为以j下标结束,则j一定要大于等于i

​ 如果i下标和j下标相邻,即j - i == 1,当对应下标字符相等时为回文,即dp[i] [j] = (arr[i] == arr[j])

​ 如果i下标和j下标不相邻,则当两下标之间的最大子串是回文且下标i和下标j对应字符相等时为回文,即dp[i] [j] = dp[i+1] [j-1] && (arr[i] == arr[j])

  1. dp初始化

​ 单个字符的都是回文

for(int i = 0; i < n; i++) {
   dp[i][i]  = true;
}
  1. 确定遍历顺序

    从递归公式中dp[i] [j]依赖于dp[i+1] [j-1],所以i正序遍历,j逆序遍历。

  2. 推导dp数组

​ j小于i的位置无效,以"cbbd"举例:

在这里插入图片描述

实现代码:

class Solution {
    public String longestPalindrome(String s) {
        int n = s.length();
        if(n < 2) {
            return s;
        }
        char[] arr = s.toCharArray();
        boolean[][] dp = new boolean[n][n];
        for(int i = 0; i < n; i++) {
            dp[i][i]  = true;
        }
        int start = 0;
        int end = 0;
        for(int i = n - 2; i >= 0; i--) {
            for(int j = i + 1; j < n; j++) {
                if(j - i == 1) {
                    dp[i][j] = (arr[i] == arr[j]);
                }else {
                    dp[i][j] = (dp[i + 1][j - 1] && (arr[i] == arr[j]));
                }
                if(dp[i][j] && j - i > end - start) {
                    start = i;
                    end = j;
                }
            }
        }
        return s.substring(start, end + 1);
    }
}

中心扩展算法

遍历每一个回文中心,扩展计算每个回文中心的最大回文长度,取最大值,回文中心有两种情况,以一个字符为中心,以两个相同字符为中心。

  • 如果i下标和j下标相邻,即j - i == 1,当对应下标字符相等时为回文
  • 如果i下标和j下标不相邻,则当两下标之间的最大子串是回文且下标i和下标j对应字符相等时为回文
class Solution {
    public String longestPalindrome(String s) {
        int n = s.length();
        if(n < 2) {
            return s;
        }
        char[] arr = s.toCharArray();
        int start = 0;
        int end = 0;
        for(int i = 0; i < n; i++) {
            int len1 = expand(arr, i, i);
            int len2 = expand(arr, i, i + 1);
            int len = Math.max(len1, len2);
            if(end - start + 1 < len) {
                start = i - ((len - 1) / 2);
                end = i + len / 2;
            }
        }
        return s.substring(start, end + 1);
    }

    public int expand(char[] arr, int left, int right) {
        while(left >= 0 && right < arr.length && arr[left] == arr[right]) {
            left--;
            right++;
        }
        return right - left - 1;
    }
}

对start、end的解释:

以bcb和bccb举例

带入式子,无论长度是奇数还是偶数:

start = i - ((len - 1) / 2);
end = i + len / 2;

都能成立

right - left - 1的解释:

当跳出循环时,left、right所指向的已经是不相等的两个字符,right - left已经减掉了一侧的一个不相等的字符,则还需要再减去另一侧那个不相等的字符。

Manacher (马拉车)算法

参考1

参考2

Manacher算法帮助我们在给定的字符串中找到最长的回文子串。它的本质就是**对暴力算法的优化。**我们先只关注奇数长度回文的处理,至于偶数的回文后面会有方法将其转化成奇数长度的回文。

约定

设 c 为已经找到的右边界最大的回文字符串的中心,并设 l 和 r 是这个回文的左右边界,即分别为最左边的字符索引和最右边的字符索引。现在,让我们举个例子来理解 c、l 和 r。

例如:“abacabacabb”

在这里插入图片描述

当从左到右一个字符一个字符遍历时,i表示正在处理的字符的索引,当 i = 1时,最长的回文子串是“aba",长度为3。

当 i = 5时,最长的回文子串是"bacabacab",长度为9:

在这里插入图片描述

现在我们知道了c、l和r表示什么,为了下面算法的讲解更加自然,我们需要了解一个概念:镜像索引。

即将中心作为对称轴的对称点,对于任何以中心 c 为中心的回文,索引 j 的镜像是 j’ 有:

c - j = j' - c
#此时,j的镜像j':
j' = (2 * c) - j

则镜像索引的计算公式为:j’ = (2 * c) - j

对于回文“abacaba”,j 的镜像是 j’,j’ 的镜像是 j:

在这里插入图片描述

当我们将 i 从左向右移动时,我们试图在每个 i 处扩展回文。这意味着我将检查是否存在以 i 为中心的回文,如果存在,我会将回文长度的一半,把它称为回文半径或者扩展的长度存储在一个名为P的新数组中。

后面都以回文半径来称呼。

如果 i 索引为中心的最大回文扩展超出当前右边界 r,则最大右边界改变,则 c 被更新为 i 并且新的 l, r 被找到并更新。

让我们以前面讨论的以 i = 3 为中心的回文“abacaba”为例。

在这里插入图片描述

因此,P[] 数组存储了以每个索引为中心的回文的回文半径。但是我们不需要每次都手动去每个索引展开去检查回文半径。c 表示当前最长奇数回文的中心。而 l, r 表示回文的左右边界。

当 i 等于3时,通过向两侧延伸,不难计算出以 i 为中心的最长回文字符串是"abacaba",回文半径为3,此时,我们令P[i]=3。

马拉车算法的核心作用就是:借助c、r、l提供的信息,在求P[i]的值时,不用傻傻的暴力向两侧延伸计算。

情况①:

以字符串 "abacaba"的P[]数组为例:

在这里插入图片描述

当 i = 4时,可以看出 i < r。此时,我们不用天真地在i处向两侧扩展。我们可以先计算出确定的以 i 为中心的回文字符串最短的回文半径,这样我们就可以在这个基础上通过继续向两侧扩展来计算P[i],而不是从头开始做。

只要索引 i’ 为中心的回文半径不超出当前最长回文的左边界 l,我们可以说索引 i 为中心的回文的最小回文半径为 P[i’]。即我们检查镜像索引i’。只要值i’ - P[i’]没有小于l,我们就可以确定在索引i为中的最短回文字符串的长度是2P[i’] + 1,也就是说,至少可以从i向左右扩展P[i’]步,最小回文半径就是P[i’]。

注意,我们只是在谈论最小的回文半径,实际的回文半径可能会更大,仍需继续向外扩获取最大值。

在上图中,P[4]=P[2]=0。我们尝试借助已有的P数组,但就这个例子而言,很不幸,P[4]仍然是0,这里有些特殊的情况我们还需要进一步考虑。

如果索引 i’ 为中心的的回文半径超出当前最长回文数的左边界l,我们可以说索引 i 为中心的回文的最小回文半径为 r - i。

情况②:

为什么索引i为中心的最小回文半径不能大于r - i ?

例子: “acacacb”

在这里插入图片描述

若最小回文半径大于r - i,即下标为6的元素变为a时,那么右边界最大的就不是 "cacac "而是"acacaca "了,和前提条件不符!

上述两种情况,用数学公式进行总结:

if(i < r){
  P[i] = Math.min(r - i, P[mirror]);
}

接下来,就只需继续向外扩展,开始从下标 i - P[I’] - 1 和 i + P[I’] + 1继续检查字符,扩展过程不断更新P[i],也不断更新最大回文半径和最大长度回文的回文中心。

如果此回文扩展长度超出 r,则将 c 更新为 i,将 r 更新为 (i + P[i]), l 更新为 (i - P[i])。

为了使这个算法成功,需要将偶数回文串转换为奇数回文串从而统一操作。只需在字符之间添加特殊字符隔开即可。

例子1: aba -> #a#b#a#。

例子2:Abba-> #a#b#b#a#。

代码实现:

class Solution {
    public String longestPalindrome(String s) {
        StringBuffer t = new StringBuffer("#");
        for (int i = 0; i < s.length(); ++i) {
            t.append(s.charAt(i));
            t.append('#');
        }
        int n = t.length();
        int[] P = new int[n];
        //记录最大回文半径
        int maxLen = 0;
        //记录最大长度回文的中心下标
        int index = 0;
        int c = 0;
        int r = 0;
        for(int i = 0; i < n; i++) {
            int mirror = (2 * c - i);
            if(i < r) {
                P[i] = Math.min(r - i, P[mirror]);
            }
            int tmpL = i - P[i] - 1;
            int tmpR = i + P[i] + 1;
            while (tmpL >= 0 && tmpR < n && t.charAt(tmpL) == t.charAt(tmpR)) {
                P[i]++;
                tmpL--;
                tmpR++;
            }
            if(i + P[i] > r) {
                c = i;
                r = i + P[i];
                if(P[i] > maxLen) {
                    maxLen = P[i];
                    index = i;
                }
            }
        }
        return s.substring((index - P[index]) / 2, (index + P[index]) / 2);
    }
}
Python爬虫实战(基础篇)—23—爬取微信小程序<随机目的地旅行>生成随机地址(附GUI版) 爬取微信小程序<随机目的地旅行>生成随机地址 阅读详情

相关推荐

树莓派5安装ROS2小白指南避坑攻略

手把手教你如何在树莓派5上顺利安装ROS2,避开常见问题与陷阱,提升配置效率。针对树莓派5安装ros2过程中的依赖冲突、源配置错误等高频难题提供解决方案,适合新手快速上手。

weixin_35754962的博客 1003

【马拉车算法/动态规划】最长回文字串

最长回文子串

Allenlzcoder的博客 712

基于树莓派与ROS的桌面机器人开发:从硬件组装到AI集成实战

嵌入式系统与机器人操作系统(ROS)是构建智能硬件的核心技术基础。嵌入式系统为设备提供了专用计算与控制能力,而ROS作为机器人开发的中间件框架,通过节点、话题和服务等机制,实现了感知、决策、执行等模块间的松耦合通信与高效集成。这种架构极大地提升了机器人系统的可扩展性与可维护性,其技术价值在于能够将复杂的AI算法,如计算机视觉和语音识别,与实体硬件执行机构无缝结合,从而快速构建出具备环境交互能力的智能体。在桌面机器人、教育套件及服务机器人原型开发等应用场景中,该技术栈尤为适用。本文以开源的Wall-E桌面机器

weixin_26775679的博客 649

【LeetCode】5.最长回文子串(中心扩散法,动态规划,超详细图文,java实现)

分析 说明: 以下解法中「暴力算法」是基础,「动态规划」必须掌握,「中心扩散」方法要会写; 「Manacher 算法」仅用于扩宽视野,绝大多数的算法面试中,面试官都不会要求写这个方法(除非面试者是竞赛选手)。 方法一:暴力匹配 (Brute Force) 根据回文子串的定义,枚举所有长度大于等于 22 的子串,依次判断它们是否是回文; 在具体实现时,可以只针对大于“当前得到的最长回文子串长度”的子串进行“回文验证”; 在记录最长回文子串的时候,可以只记录“当前子串的起始位置”和“子串长度”,不必做截取

Viper的程序员修炼手册 1622

宇树智能人形机器人模块化腿部动力系统技术拆解

o电机防摔防护板(3.1.5.1)→端盖总成(3.1.5.2)→电机外壳(3.1.5.4)的冲击力传递路径;o散热风扇(3.1.3.1)推动冷风→大腿基座腔体→散热片组(3.1.5.7)→中空大腿杆排出;o防御专利:覆盖“关节热管理风道接口标准”、“抗冲击结构身份编码”;o大腿杆腔体(3.1.3.4)内置反平行四边形机构,避免连杆外露。:力传感器(3.1.8.4.2)仅部署于足端,缺失关节力矩反馈。:更换行星减速器(3.1.5.5)需拆解整个电机模块;o热量传导路径:电机定子→外壳→散热片组。

weixin_50955533的博客 1231

雾化器硬件设计:从N155驱动到PCB可量产实现

雾化器是典型的机电一体化嵌入式终端,其硬件设计本质是电源完整性、信号完整性与热-机械协同的系统工程。核心在于理解高压脉冲驱动原理(如2.4MHz固定频率匹配压电谐振)、电源域隔离机制(AGND/DGND/PGND分域设计)及约束驱动的PCB转化逻辑。技术价值体现在电气可靠性(如OTP/OLP保护)、生产可制造性(DFM合规焊盘与钢网)与环境鲁棒性(三防漆、散热过孔)。典型应用场景覆盖加湿器、医疗雾化仪与工业微流控设备。本文聚焦超声波雾化控制板的硬线实现路径,深入解析N155驱动芯片选型、网络标签工程误用陷阱

weixin_35649491的博客 614

一文搞懂马拉车算法附算法Java版本实现及实战leetcode题目

一文搞懂马拉车算法附算法Java版本实现及实战leetcode题目。1975年,Manacher发明了Manacher算法(中文名:马拉车算法),是一个可以在中返回字符串s中的算法,十分巧妙。

m0_55953162的博客 436

Dify学习-19-EXCEL数据如何建立知识库+知识库的学习ING

Args:"""定义类,继承自类文档字符串说明这个类用于加载Excel文件这个类提供了从Excel文件(.xls和.xlsx)中提取数据并转换为文档列表的功能。处理两种Excel格式保留超链接信息跳过空行将每行数据转换为键值对格式的文档在元数据中保留源文件信息对于.xlsx文件使用openpyxl处理,可以获取更多单元格信息(如超链接);对于.xls文件则使用pandas的xlrd引擎处理。

Claire的博客 3433

「字符串」Manacher算法(马拉车)/ LeetCode 05(C++)

Manacher算法利用回文串的对称性质实现线性时间内的回文串查找。本文详解了这种算法的思想和实现代码。

dakingffo的博客 2098

AI 赋能测试全生命周期:多 Agent 协同的自动化提效方案

本文提出了一种基于Coze平台的多Agent协同测试解决方案,旨在解决软件测试中PRD解析不清晰、测试点覆盖不全、用例编写效率低、代码生成耗时等痛点。通过PRD优化、测试点生成、测试用例生成和单元测试框架生成四个Agent的协同工作,结合Cursor工具实现从需求到代码的全链路自动化。以电商平台登录模块为例,展示了从模糊PRD到标准化测试用例和可执行Java单元测试代码的完整转化流程。该方案通过AI赋能显著提升测试效率,减少人工干预,实现测试覆盖率≥95%,为快速迭代的软件研发提供了高效的测试自动化支持。

QINJIEEE的博客 1098

杰理SDK入门教程(二):USB升级程序

开发板升级操作指南 摘要:本文介绍了开发板程序升级的两种方式(常规升级和串口升级),重点说明了常规升级的操作步骤: 拨码设置:提供4种拨码方式(不拨/1档/2档/3档),对应不同指示灯状态和按键要求 硬件连接:强制升级工具需正确连接电脑和开发板(注意USB接口方向) 升级流程:根据拨码状态操作按键,观察指示灯变化(红灯常亮绿灯灭表示进入升级模式) 执行升级:运行SDK中的download.bat完成升级 文中还包含拨码开关说明、指示灯状态对照表以及升级原理说明,帮助用户理解升级过程。升级成功后在设备管理器可

qq_42014563的博客 1114

LeetCode高频题5:最长回文子串,利用马拉车manacher算加速

1)马拉车manacher算法的核心在利用i位置对称位置2c-i的回文半径,加速求得i的回文半径,每次把最大回文中心更新给maxC,回文半径更新给pArr,最大回文右边界回文给R 2)最后马拉车算法的maxC,需要除2对应映射给原串s,然后求start和end,用substring截取即可。 3)笔试求AC,可以不考虑空间复杂度,但是面试既要考虑时间复杂度最优,也要考虑空间复杂度最优。...

weixin_46838716的博客 529

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Leetcode算法系列| 5. 最长回文子串

在实际执行时,我们先求所有长度为1的子串的P值,再求所有长度为2的子串的P值,之后再求长度3的,以此类推,一直到长度为s.Length的。对于上面公式有2个特殊情况,当子串长度为1或2时,上面公式不成立。

游戏开发小Y的博客 3万+

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

LeetCode5.最长回文子串

LeetCode5.最长回文子串 问题 分析 解法一:中心扩散法 顾名思义就是每一个位置中心去扩散,去找回文串,遇到不是回文串的时候结束。 寻找方法就是首先先找其左边和右边位置,如果相等即继续走,只到走到左边的值和右边的值都不和中间元素相等,然后判断左右值是否相等。 解法二:动态规划 ​ 回看中心扩展算法,其实中间做了很多重复的计算,而动态规划就是为了减少重复计算的问题。即以空间换时间,将计算结果暂时存放起来,以避免重复计算 使用boolean dp[l] [r]表示字符串l到r这段是否是回文串,如果

冢狐的私人空间 2378

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

力扣5-最长回文子串

Copyright © Zi10ng 道阻且长 题目地址 题目描述 给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。 示例 1: 输入: “babad” 输出: “bab” 题目思路 刚看到这个题的时候,想到了两种做法,一种是O(3),另外一种是O(2) 第一种是从左到右,从右到左,从子串的两边开始遍历每一个子字符串并核对比较,即完全暴力 第二种是从左...

王星星 2260

LeetCode5. 最长回文子串(java + 暴力 + 中心扩展 + 动态规划 + 马拉车算法)

最长回文子串 1. 题目描述: ​ 给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。 示例1: 输入: "babad" 输出: "bab" 注意: "aba" 也是一个有效答案。 示例2: 输入: "cbbd" 输出: "bb" 2. 题目分析: ​ leetcode的官方题解写得挺好的,以下就参考它的一些做法来写一下。 ​ 以下的几种方法多多少少...

阿福呀 869

[dp][马拉车算法][中心扩展法]leetcode5:最长回文子串(medium)

题目: 题解: ①:动态规划 dp[i][j]表示s[i]至s[j]所表示的子字符串是否为回文串,是则为1,不是则为0。这样可根据s[i]是否等于s[j],可以把转移情况分为两类: 1)若s[i]==s[j],那么只要s[i+1]至s[j-1]是回文串,那么s[i]至s[j]就是回文串;如果s[i+1]至s[j-1]不是回文串,则s[i]至s[j]就不是回文串。 2)若s[i]!=s[j],...

algsup 605

LeetCode-5. 最长回文子串(中心拓展法、马拉车算法)

5. 最长回文子串 【题目】: 【方法1】:中心拓展法,参考647. 回文子串 // 中心拓展法 public String longestPalindrome1(String s) { if(s==null || s.length()<=1){ return s; } String res=...

芝士不知世的笔记 723

马拉车算法 LeetCode-5.最长回文子串、LeetCode-214.最短回文串

马拉车算法 马拉车算法是一种寻找给定字符串中的最长回文子串的方法,时间复杂度为 O(n) 。它除了可以解决“最长回文子串”的问题,还能解决由此变形的一些衍生问题,如“最短回文串” 这里是马拉车算法的详述: 一文让你彻底明白马拉车算法 最长回文子串 这里是题目描述:LeetCode-5.最长回文子串 O(n)时间复杂度马拉车算法: 马拉车算法解决的就是这个问题,因此不再做详述 马拉车算法题解代码: O(n2)时间复杂度动规方法: 本题可以还用动态规划的方法来解:维护一个二维表dp,dp[i][j]存储给定字

qq_24210431的博客 510

LeetCode 5. Longest Palindromic Substring 最长回文子串 C#

前言 本文介绍了 LeetCode 第 5 题 , “Longest Palindromic Substring”, 也就是 “最长回文子串” 的问题. 本文使用 C# 语言完成题目,介绍了 中心扩展法、马拉车算法 等 多种方法供大家参考。 题目 English LeetCode 5. Longest Palindromic Substring Given a string s, find th...

wf824284257的博客 751

LeetCode5-最长回文子串(1)

面试前的“练手”还是很重要的,所以开始面试之前一定要准备好啊,不然也是耽搁面试官和自己的时间。我自己是刷了不少面试题的,所以在面试过程中才能够做到心中有数,基本上会清楚面试过程中会问到哪些知识点,高频题又有哪些,所以刷题是面试前期准备过程中非常重要的一点。《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!也是耽搁面试官和自己的时间。

2301_76668692的博客 865

leetcode 5. 最长回文子串 暴力法、中心扩展算法、动态规划,马拉车算法(Manacher Algorithm)

给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。 示例 1: 输入: "babad" 输出: "bab" 注意: "aba" 也是一个有效答案 首先,看懂题目很重要!!!啥是回文? 把相同的词汇或句子 [1] ,在下文中调换位置或颠倒过来,产生首尾回环的情趣,叫做回文,也叫回环。 这道题对时间复杂度没有要求,可即便如此,刚开始还是毫无办法 ╮(...

fuyuande的博客 945

用动态规划算法、中间扩展算法、马拉车(Manacher)算法 求最长回文子串

题目描述 给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。 示例 1: 输入: “babad” 输出: “bab” 注意: “aba” 也是一个有效答案。 示例 2: 输入: “cbbd” 输出: “bb” 解题思路 考虑 “ababa” 这个示例。如果我们已经知道“bab” 是回文,那么很明显,“ababa” 一定是回文,因为它的左首字母和右尾...

weixin_42907817的博客 607

LeetCode 5. 最长回文子串(中心扩散法 or 动态规划 or 马拉车算法)

题目:给定一个字符串s,找到s中最长的回文子串。你可以假设s的最大长度为 1000。 思路: 1.中心扩散法: 枚举每一个位置(两个位置)作为中心点的情况,向两边扩散,不断更新最大长度的答案。 时间复杂度O(n^2),空间复杂度O(1)。 2.动态规划: 定义状态dp[i][j]为区间[i,j]的s的子串是否为回文。假如dp[i][j]是回文,且s[i-1]==s[j+1],那么dp[i-1][j+1]也是回文。在这个过程中不断更新最大长度的答案,最后输出这个最长的回文子串即可。 时...

菜鸡成长史 626

leetcode 5 最长回文子串 三种解法

动态规划 dp(i,j)={true,i=js[i]==s[j]?true:false,j−i<2dp(i+1,j−1)&&s[i]==s[j],j−i>=2 dp(i,j)=\left\{ \begin{aligned} &true , \quad i = j\\ &s[i] == s[j]?true:false\quad, j-i<2\\ &dp(i+1,j-1)\&\&s[i] == s[j] ,\quad j - i&gt

星星的博客 291

最长回文子串:中心扩展法与动态规划详解

回文串是计算机科学中经典的字符串问题,指正读反读都相同的字符序列。其核心原理是通过对称性检测来识别特定模式的子串,在文本处理、生物信息学等领域有重要应用。针对最长回文子串问题,中心扩展法以O(n²)时间复杂度和O(1)空间复杂度成为最优解,通过从每个字符中心向两侧扩展寻找回文。动态规划则通过构建状态转移表来解决问题,虽然空间复杂度较高,但能记录所有子串的回文状态。这两种方法都是力扣hot100等算法题库中的高频考点,特别适合准备技术面试的开发者掌握。在实际工程中,这些算法可应用于DNA序列分析、 plagi

weixin_32288959的博客 279
上一篇: 【LeetCode】498. 对角线遍历
下一篇: 多重背包的二进制优化
Sancean
博客等级 码龄6年 2472粉丝 149原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值