LeetCode hot 100—最长回文子串

RYU+Mininet的SDN架构-设计校园网络(一) 现有一个中学,需要设计一个中小型网络满足学校的网络需求。学校有教学区,实验室区域和服务器区域。教学区为了满足接入的灵活性和信号强度要求,需要满足设计WIFI满足日常教室和同学需求,接入上限为200人。实验室区域需要有一台教师主机方便管理实验室其余电脑,并且教师主机可以访问学校服务器,方便为同学们实验室授课。学校服务器区域设有学校相关重要文件和学校网页相关内容。最后学校还会接入互联网。 阅读详情

题目

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

示例

示例 1:

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

示例 2:

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

分析

动态规划法

使用动态规划来解决最长回文子串问题的核心思想是利用子问题的解来构建更大问题的解。具体来说,我们定义一个二维布尔数组 dp[i][j] ,其中 dp[i][j] 表示字符串 s 从索引 i 到索引 j 的子串是否为回文串。

状态定义

dp[i][j]:表示子串 s[i...j] 是否为回文串,true 表示是,false 表示不是。

状态转移方程

当 s[i] == s[j] 时:

  • 如果 j - i < 2(即子串长度为 1 或 2),那么 dp[i][j] = true 。例如,单个字符一定是回文串,两个相同字符组成的子串也是回文串。
  • 如果 dp[i + 1][j - 1] 为 true ,那么 dp[i][j] = true 。也就是说,当两端字符相同,且去掉两端字符后的子串也是回文串时,当前子串就是回文串。

当 s[i] != s[j] 时,dp[i][j] = false 。

初始化

对于单个字符,即 i == j 时,dp[i][j] = true ,因为单个字符一定是回文串。

遍历顺序

由于状态转移方程依赖于 dp[i + 1][j - 1] ,所以我们需要按照子串长度从小到大的顺序进行遍历,即先遍历长度为 1 的子串,再遍历长度为 2 的子串,以此类推。

记录最长回文子串

在遍历过程中,记录下最长回文子串的起始位置和长度,最后根据这些信息截取最长回文子串。

时间复杂度:O(n^{2}),n 是字符串的长度

空间复杂度:O(n^{2})

class Solution {
public:
    string longestPalindrome(string s) {
        int n = s.length();
        if (n < 2) {
            return s;
        }
        // 初始化 dp 数组
        std::vector<std::vector<bool>> dp(n, std::vector<bool>(n, false));
        int start = 0;  // 最长回文子串的起始位置
        int maxLen = 1; // 最长回文子串的长度
        // 单个字符一定是回文串
        for (int i = 0; i < n; ++i) {
            dp[i][i] = true;
        }
        // 枚举子串长度
        for (int len = 2; len <= n; ++len) {
            // 枚举子串的起始位置
            for (int i = 0; i <= n - len; ++i) {
                int j = i + len - 1; // 子串的结束位置
                if (s[i] == s[j]) {
                    if (len <= 2) {
                        dp[i][j] = true;
                    } else {
                        dp[i][j] = dp[i + 1][j - 1];
                    }
                } else {
                    dp[i][j] = false;
                }
                // 更新最长回文子串的信息
                if (dp[i][j] && len > maxLen) {
                    start = i;
                    maxLen = len;
                }
            }
        }
        return s.substr(start, maxLen);
    }
};

中心扩展法

可以使用中心扩展法来找出字符串 s 中最长的回文子串。该方法的核心思想是,回文串具有对称性,因此可以以每个字符或者每两个相邻字符为中心,向两边扩展来判断是否构成回文串。

具体步骤如下:

  • 遍历字符串 s 中的每个字符,将其作为回文串的中心。
  • 对于每个中心,分别考虑两种情况:
    • 以单个字符为中心扩展,形成奇数长度的回文串。
    • 以两个相邻字符为中心扩展,形成偶数长度的回文串。
  • 在扩展过程中,不断比较左右字符是否相等,若相等则继续扩展,直到不相等为止。
  • 记录每次扩展得到的回文串的长度和起始位置,最终找出最长的回文子串。

时间复杂度:O(n^{2}),n 是字符串的长度

空间复杂度:O(1)

class Solution {
public:
    string longestPalindrome(string s) {
        if (s.empty()) return "";
        int start = 0, maxLen = 0;
        // 遍历字符串中的每个字符
        for (int i = 0; i < s.length(); ++i) {
            // 以单个字符为中心扩展
            int len1 = expandAroundCenter(s, i, i);
            // 以两个相邻字符为中心扩展
            int len2 = expandAroundCenter(s, i, i + 1);
            // 取两种情况中的最大长度
            int len = max(len1, len2);
            if (len > maxLen) {
                maxLen = len;
                // 计算最长回文子串的起始位置
                start = i - (len - 1) / 2;
            }
        }
        // 截取最长回文子串
        return s.substr(start, maxLen);
    }

private:
    // 中心扩展函数
    int expandAroundCenter(const string& s, int left, int right) {
        while (left >= 0 && right < s.length() && s[left] == s[right]) {
            --left;
            ++right;
        }
        // 返回回文串的长度
        return right - left - 1;
    }
};    
Zabbix在Ubuntu 22.04上的性能优化与监控实战:从基础安装到高级配置 本文详细介绍了在Ubuntu 22.04系统上部署和优化Zabbix监控系统的完整流程,从基础安装到高级配置。内容包括MySQL数据库设置、Zabbix服务器与Web前端优化、性能调优策略以及实战监控场景应用,帮助用户构建高效的企业级监控解决方案。 阅读详情

相关推荐

从零搭建AMESim与Matlab/Simulink联合仿真环境(2024版软件配置详解)

本文详细介绍了2024年最新版AMESim与Matlab/Simulink联合仿真环境的搭建与配置方法。从软件安装顺序、路径设置到编译器配置,逐步指导如何实现高效联合仿真,特别强调了版本兼容性和环境变量设置等关键细节,帮助工程师快速解决常见问题并优化仿真性能。

weixin_42538752的博客 735

动态规划:力扣hot100 最长回文子串

链接:https://programmercarl.com/0647.%E5%9B%9E%E6%

woaiMATLABbai的博客 378

XC7K325T FPGA硬件设计实战:从板级原理图到高速接口优化

本文以XC7K325T FPGA为核心,详细阐述了从板级原理图设计到高速接口优化的完整硬件实战流程。内容涵盖芯片管脚与电源规划、时钟复位配置电路设计,并重点解析了DDR3内存子系统以及PCIe与光纤接口等高速电路的原理图与PCB设计要点,旨在帮助工程师构建稳定可靠的高性能硬件平台。

python9snake的博客 513

【Leetcode HOT100】5. 最长回文子串

n = len(s)begin = 0if n < 2:return sdp = [[False] * n for _ in range(n)] # n行n列dp[i][i] = True # 对角线即单个元素一定是回文# 子串长度# 左边界# 右边界# 边界异常处理if s[left]!else:# s[i..j]长度为2或3,不用检查是否回文# aba型不用判断else:#去头去尾,判断子串是否为回文串# 判断当前串是否为最长回文串。

ioranger的博客 134

三、Crowd与JIRA、Confluence用户集成并SSO单点登录

补充说明: 通过此方法集成后,用户、组以及用户和组的关系都在Crowd系统中存储,但各个系统的权限仍由各系统控制,也可在JIRA和Confluence中添加和删除用户。 在做步骤4和步骤5的时候,要特别小心,确保当前系统的超级权限用户(一般为admin,具体看当前系统的全局权限配置)和组以及它们的关系已经在Crowd中同样存在了,才可切换并禁用当前系统的内部用户目录,否则可能造成权限丢失等严重问题(因为禁用了内部用户目录,而Crowd中又不存在这个超级权限用户和组或它们的关系,所以权限就丢失了) 维护示例

weixin_38621072的博客 2985

A-Level经济例题解析及练习Opportunity Cost

例题Question: Opportunity CostYou are selling your 1996 Mustang.&nbsp; You have already spent $1000 on repairs.&nbsp;At the last minute, the transmission dies.&nbsp; You can pay $600 to have it repaired, or sell the car “as is.”In each of the fol

Alevel3的博客 744

Leetcode Hot100 第66题 5.最长回文子串

【代码】Leetcode Hot100 第66题 5.最长回文子串。

weixin_45850570的博客 234

Synopsys工具filter命令:从数据筛选到高效IC设计的实战指南

在数字集成电路设计流程中,数据筛选与查询是工程师处理海量网表、时序报告和设计约束的核心需求。其原理在于通过声明式查询语言,直接对设计对象(如单元、网络、路径)的属性进行逻辑判断与模式匹配,从而精准定位目标。这种技术价值在于将工程师从繁琐的过程式脚本循环中解放出来,大幅提升代码可读性与运行效率,直接调用工具内置的高性能查询引擎。在实际应用场景中,它广泛用于物理与时序联合分析、层次化模块操作、动态约束生成以及自动化报告生成。本文聚焦于Synopsys工具链中filter命令的高阶用法,深入解析其表达式语法、正则

weixin_28007513的博客 577

力扣HOT100之多维动态规划:5. 最长回文子串

这道题属于动态规划板块,但是我感觉这道题用动态规划相当晦涩难懂,看了一圈题解发现还是最好用,感觉这道题没有必要为了动态规划而动态规划,中心扩散法我感觉讲得很不错,非常通俗易懂,代码风格也很好,可以去看看他的视频。这道题就不用动态规划来做了,以后笔试面试遇到这道题就直接用了。

weixin_52151595的博客 495

Win7/10/11文件拖拽导致资源管理器闪退问题

最近老是遇到把文件从资源管理器拖动到微信或者浏览器时,资源管理器直接闪退的问题,一开始在公司遇到了还以为是电脑配置太低,直到被封闭在家办公,发现自己的高级电脑也有这个问题,那就来了解了解问题是出在什么地方把。

Nicer_feng's blog 1万+

用 CORRESPONDING #( ) 优雅复制同名字段:从 MOVE-CORRESPONDING 到现代 ABAP 结构映射的关键差异与最佳实践

摘要:本文深入探讨了SAP ABAP中结构数据复制的两种主要方式——传统MOVE-CORRESPONDING与现代CORRESPONDING #()的核心差异。重点分析了现代构造表达式会初始化目标结构的关键特性,通过SAP_GWFND开发中的实际案例展示了这一差异可能引发的线上问题。同时介绍了使用BASE保留目标字段值的技巧,以及通过MAPPING处理字段名不一致的场景。文章为ABAP开发者提供了在S/4HANA、BTP及RAP等现代架构下的数据映射最佳实践,帮助规避常见的维护陷阱。(149字)

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 2262

【力扣hot100】 5. 最长回文子串

本文介绍了寻找字符串中最长回文子串的算法。采用滑动窗口方法,通过左右指针从字符串两端向中间遍历,检查子串是否为回文。算法进行了多处剪枝优化:当窗口长度小于已知最长回文时提前终止,字符不匹配时立即跳出循环。时间复杂度为O(n^3),空间复杂度O(1)。该方法直观易懂,适用于中等长度字符串,但对于超长字符串可能需要更优算法。

prowity的博客 405

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

【力扣Hot100】5. 最长回文子串

题目:最长回文子串 思路: 特判:过滤掉空字符串的情况 初始化: 定义一个变量maxLen表示最长字符串长度,begin表示最长字符串首字符的位置; 定义一个二维动态数组dp,dp[i][j]表示从第i个字符开始到第j个字符结尾的字符串是否为回文字符串,初始条件就是每个字符都是一个回文字符串,也就是dp[i][i] = true; 利用i,j两个指针遍历整个字符串,填满整个动态数组的状态值,取值范围为j: [1,len); i: [0,j) s_i 不等于 s_j ==> false;

weixin_43958974的博客 304

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

扩展kmp求最长回文子串_LeetCode 热题 HOT 100(04,最长回文子串)

LeetCode 热题 HOT 100(04,最长回文子串)题目:最长回文子串给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。题目Url: https://leetcode-cn.com/problems/longest-palindromic-substring/示例示例1输入: "babad"输出: "bab"注意: "aba" 也是一个有效答...

weixin_34494211的博客 99

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

【力扣hot100题】最长回文子串(60)

"aba" 同样是符合题意的答案。中最长的 回文 子串。

2303_80799640的博客 468

【Leetcode hot 100】5.最长回文子串

本文介绍了两种解决最长回文子串问题的算法:中心扩散法和动态规划法。中心扩散法从所有可能的回文中心向两边扩展验证,时间复杂度O(n²),空间复杂度O(1),实现简单高效。动态规划法利用dp数组记录子串回文状态,同样时间O(n²)但空间O(n²)。对比显示中心扩散法更优,适合实际应用;动态规划法有助于理解子问题分解思想。两种方法均能有效解决问题,可根据需求选择。

专注Java和MySQL领域知识分享 1007

力扣hot100 最长回文子串 中心扩散法 动态规划 一题多解 满注释版

java

人言束负兑生|完美是完蛋的开始 573

hot100 leetcode5 最长回文子串

help函数的功能是求出以l,r为中心向两边扩散,最长的回文字符串(返回值是这个最长的回文字符串,而不是最长回文字符串的长度),help函数里面主要是一个while函数,跳出while函数说明左指针和右指针指向的字符不相等了,求出此时的字符串。注意回文子串的性质,一个回文子串去掉第一个字符和最后一个字符,剩下的字符串依然是回文字符串,s[i]~s[j]如果是回文子串,当s[i-1]==s[j+1]的时候,s[i-1]~s[j+1]也是回文子串。根据dp[i+1][j-1] 推出dp[i][j]

weixin_47414034的博客 470

leetcode hot100 之 最长回文子串

题目 给定一个字符串,找出最长回文子串。 输入:s = “babad” 输出:“bab” 解释:“aba” 同样是符合题意的答案。 原题链接: https://leetcode-cn.com/problems/longest-palindromic-substring/ 思路 动态规划的思路,主要是两个点,一个是初始化,一个是转化方程。 如果 s[i, j] 是一个回文子串,那么 s[i+1, j-1] 也是一个回文子串。反过来,如果s[i+1, j-1] 是一个回文子串,且 s[i] == s[j],

smallplum123的博客 501

leetcode hot100 最长回文子串 Java

题目描述 给你一个字符串 s,找到 s 中最长的回文子串。 示例 1: 输入:s = “babad” 输出:“bab” 解释:“aba” 同样是符合题意的答案。 示例 2: 输入:s = “cbbd” 输出:“bb” 方法一: 暴力解法:【但是会超时】 写一个判断是否为”回文串“的方法: 如果字符串起始位置和终止位置的字符相同,再缩小范围判断,一旦不同,就返回false public boolean isHuiWen(String s){ int len = s.length(); for(int i =

stonney的博客 272

【Hot100】LeetCode—5. 最长回文子串

5. 最长回文子串。

weixin_44382896的博客 578

LeetCode Hot 100 最长回文子串

上文的所有讨论是建立在子串长度大于 2 的前提之上的,我们还需要考虑动态规划中的边界条件,即子串的长度为 1 或 2。对于一个子串而言,如果它是回文串,并且长度大于 2,那么将它首尾的两个字母去除之后,它仍然是个回文串。注意:在状态转移方程中,我们是从长度较短的字符串向长度较长的字符串进行转移的,因此一定要注意动态规划的循环顺序。根据这样的思路,我们就可以用动态规划的方法解决本题。也就是说,只有 s[i+1:j−1] 是回文串,并且 s 的第 i 和 j 个字母相同时,s[i:j] 才会是回文串。

2302_76776557的博客 395

Leetcode Hot100 最长回文子串

给你一个字符串 s,找到 s 中最长的回文子串。最容易理解的中心扩散法,我们记忆这一种解法。解释:“aba” 同样是符合题意的答案。输入:s = “babad”输入:s = “cbbd”

wtopps的专栏 406

力扣Hot100系列21(Java)——[多维动态规划]总结(不同路径,最小路径和,最长回文子串,最长公共子序列, 编辑距离)

本文总结了力扣Hot100中关于多维动态规划的五道经典题目: 不同路径:计算m×n网格中从左上角到右下角的所有路径数(只能右/下移动),通过初始化边界和递推公式f[i][j]=f[i-1][j]+f[i][j-1]求解; 最小路径和:在二维网格中寻找从左上到右下的最小数字和路径,通过动态累加边界值并取左/上较小值递推; 最长回文子串:通过中心扩展法寻找字符串中的最长回文子串,记录长度和起始位置。 还有最长公共子序列和编辑距离两道题。 每道题均附代码实现和示例解析,帮助理解动态规划的核心思想与应用场景。

2402_89049045的博客 443

LeetCode hot100 【多维动态规划】最长回文子串(各种解法层层递进 )

本文分析了最长回文子串问题的多种解法:暴力解法时间复杂度O(n³);DFS+备忘录优化为O(n²);动态规划自底向上解法;中心扩展法(面试推荐,O(n²));以及Manacher算法(唯一线性O(n)解法)。重点比较了不同方法的时间复杂度和适用场景,其中中心扩展法实现简单效率较高,而Manacher算法最优但实现复杂。每种解法都附有对应力扣题目链接供参考。

weixin_45839019的博客 57

力扣 Hot100 5. 最长回文子串

力扣

minayu的博客 366
上一篇: LeetCode hot 100—编辑距离
下一篇: LeetCode hot 100—子集
rigidwill666
博客等级 码龄7年 508粉丝 108原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

rigidwill666

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值