LeetCode hot 100—最长回文子串

数仓 - 促销敏感度、评论敏感度 1. 促销敏感度 步骤1. 首先按照最后一次下单时间及有无复购情况将用户分为四大群体: 近一年有购物行为且复购的用户 -- L1 (今年复购用户) 近一年有购物行为但无复购的用户 --L2 (今年一单购用户) 最后一次下单时间在1年之前且有复购的用户 --L3 (今年无购且只有一单用户) 最后一次下单时间在1年之前但无复购的用户 -- L4 (今年无购多单用户) 步骤2. 每一类用户群再根据优惠订单占比、每单优惠金额占比的平均值、优惠金额这三个指标进行k-means聚类,分为: 非常敏感 - 阅读详情

题目

给你一个字符串 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;
    }
};    
华为昇腾 910B 实战:DeepSeek-R1 蒸馏模型高效部署与性能调优全解析 本文详细解析了在华为昇腾910B硬件平台上高效部署DeepSeek-R1蒸馏系列模型(14B/32B版本)的完整实战流程。内容涵盖从MindIE环境搭建、镜像获取、模型准备,到服务配置、内存参数调优、性能测试及常见问题排查,为开发者提供了基于昇腾910B进行大模型部署与优化的全链路指南。 阅读详情

相关推荐

别再用MounRiver了!在VSCode里用PlatformIO搞定CH32V208开发(附完整配置流程)

本文详细介绍了如何在VSCode中使用PlatformIO进行CH32V208开发,替代传统的MounRiver Studio。通过完整的配置流程和优化技巧,开发者可以构建高效、现代化的RISC-V开发环境,显著提升编译速度和开发效率。

weixin_28711397的博客 534

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

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

woaiMATLABbai的博客 378

5.1 Tessent Atpg系列 第八章 Test Pattern Generation - Verify Test Pattern

为什么要做基于timing的仿真,意义在于可以比较ATPG工具和simulator工具的差异性。因为时序的差异导致不同的结果。首先你需要通过write_patern 这句cmd来写出pattern,默认是parallel 模式,除非你用-serial 指定写出serial, 因为serial 文件非常大,所以你可以使用-sample 开关写出部分pattern即可,工具会根据每一种pattern 类型都会至少保存一只。 另外,你也可以使用-start -end 开关来减少文件大小,但是这样的截取,是不可靠的

ciscomonkey的博客 7763

【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

【嵌入式面经】上海 70迈 线上笔试

“关注|点赞|收藏” 福利干货第一时间送达!最近在做免费的嵌入式知识分享,帮助对嵌入式感兴趣的同学学习嵌入式、做项目、找工作!

qq_56921854的博客 1138

数据库崩溃恢复机制:REDO日志与UNDO日志详解

在数据库管理系统中,事务的持久性和一致性是至关重要的。为了保证在系统崩溃或发生故障时数据不会丢失,数据库引入了恢复机制。其中,REDO日志和UNDO日志是两种关键的恢复技术。本文将详细描述这两种日志的作用、工作原理以及它们在数据库崩溃恢复中的应用。

My_wife_QBL的博客 1411

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

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

weixin_45850570的博客 234

华为FusionCharge 720kW液冷直流快充桩主电流全路径深度详解

本文档详细介绍了华为FusionCharge 720kW液冷分体式直流充电系统的主电流路径全链路解析,适用于配套DS720-720LCNA1充电主机及DT600L1-CNA1液冷终端、DT250N2-CNA1自然冷终端的运维工作。内容涵盖从电网交流输入到电动汽车充电的全过程,重点解析交流门、整流正门、主控正门等五大柜门区域的核心元器件分布及功能,包括额定参数、安全规范、故障排查等关键运维知识。操作人员需持有高压电工证并通过专项培训,作业时必须严格遵守断电验电、穿戴PPE防护装备等安全红线。文档通过16个关键

2401_84939870的博客 750

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

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

weixin_52151595的博客 495

使用 Python 构建 Reddit 热帖爬虫:抓取热门讨论帖和评论

在现代互联网中,Reddit 被誉为全球最大、最活跃的讨论平台之一,汇聚了各种主题的帖子、评论和社交互动。因此,抓取 Reddit 上的热门帖子和评论可以为我们提供一个丰富的文本数据源,可以用于情感分析、话题建模、趋势分析等应用。Reddit 提供了官方的 API,可以让开发者获取包括帖子、评论、用户信息等在内的各种数据。我们可以结合上述方法,抓取多个热门帖子,并将每个帖子的标题、作者、发布时间和评论内容保存到一个数据结构中。每个帖子的对象包含了丰富的信息,如标题、内容、发布时间、作者等。

2201_76125261的博客 382

【天气雷达】双偏振产品-差分传播相移KDP详解

双偏振产品-差分传播相移KDP详解。

珞瑜的博客 2662

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

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

prowity的博客 405

C3 模块与普通 Bottleneck 堆叠区别

维度普通 Bottleneck 堆叠C3 模块设计理念残差学习CSP + 特征分治信息路径单一路径双路径(主干 + bypass)融合方式相加(Add)拼接(Concat)+ 卷积计算效率较低高(通道减半)特征保留弱(多次非线性)强(直连保留原始信息)梯度传播单一主路径多样化、更稳定任务适配通用(分类为主)专为目标检测优化可扩展性有限极强(即插即用各种模块)实际性能基准线显著优于(尤其在小目标和效率方面)

浩瀚之水的专栏 107

【力扣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

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

SAP B1中文培訓教材_SDK

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

扩展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

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

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

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

2303_80799640的博客 468

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

【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
上一篇: 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、付费专栏及课程。

余额充值