跳到主要内容
极客日志极客日志
首页博客AI提示词GitHub精选代理工具
搜索
|注册
博客列表
Python算法

LeetCode 第 5 题:最长回文子串

LeetCode 第 5 题要求找出字符串中最长的回文子串。文章对比了暴力破解法和中心扩展算法。暴力法遍历所有子串判断回文,效率低且易超时。中心扩展算法通过固定中心向两侧扩展寻找回文,优化了时间复杂度。提供了基于 Python 的实现代码及详细逻辑解析,帮助理解回文串处理的核心思路。

花里胡哨发布于 2020/2/12更新于 2026/4/231 浏览
LeetCode 第 5 题:最长回文子串

LeetCode 第 5 题:最长回文子串

题目描述

给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。

示例

示例 1:

输入:"babad"
输出:"bab"
注意:"aba" 也是一个有效答案。

示例 2:

输入:"cbbd"
输出:"bb"

题目解析

看到该题目,首先想到的是遍历字符串,取出子串,判断其逆置后是否与其相同,即判断是否符合回文。从中寻找最长的一个。这是暴力破解法。

暴力破解法

class Solution:
    def longestPalindrome(self, s: str) -> str:
        string = ""
        length = -1
        for i in range(len(s)):
            for j in range(i, len(s)):
                a = s[i:j+1]
                if a == a[::-1] and len(a) > length:
                    string = a
                    length = len(a)
        return string

其中 a[::-1] 运用了列表的切片,使其逆序排列。执行测试数据时通过了,但在提交的时候出了问题,原因是超时。因为该方法需要两层循环,对于长字符串(如'一千个一')会导致超时。

中心扩展算法

参考题解后,采用中心扩展算法。

class Solution:
    def longestPalindrome(self, s: str) -> str:
        if s == s[::-1]:
            return s
        res = s[:1]
        for i in range(len(s)):
            len1 = self.expandAroundCenter(s, i, i)
            len2 = self.expandAroundCenter(s, i, i+1)
            res = max(res, len1, len2, key=len)
        return res
    
    def expandAroundCenter(self, s, left, right):
        while left >= 0 and right < len(s) and s[left] == s[right]:
            left -= 1
            right += 1
        return s[left+1:right]

中心扩展算法需要考虑 2N+1 个中心。分别为回文子串长度为奇数时,中心值为中间一个字符;回文子串长度为偶数时,中心值为中间两个字符。循环遍历这些情况,再建立一个从中间扩展两侧字符的函数,当两侧字符一致时,向外扩展一层。

目录

  1. LeetCode 第 5 题:最长回文子串
  2. 题目描述
  3. 示例
  4. 题目解析
  5. 暴力破解法
  6. 中心扩展算法
  • 💰 8折买阿里云服务器限时8折了解详情
  • 💰 8折买阿里云服务器限时8折购买
  • 🦞 5分钟部署阿里云小龙虾了解详情
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog

更多推荐文章

查看全部
  • Python 自学项目资源整理
  • 提升 SQL 技能的 7 个最佳练习平台
  • 基于SpringBoot的网上租赁系统设计与实现
  • Java 企业人事工资管理系统设计与实现
  • Linux LVM 磁盘管理工具详解:物理卷、卷组与逻辑卷操作
  • 软件设计各个模块分析
  • 交换瓶子问题 Java 最小交换次数解法
  • Java Cookie 技术原理与应用
  • CopyOnWriteArrayList 源码解析
  • Python 学习后如何找工作及就业方向分析
  • Windows 环境下如何将本地代码推送到 Git 远程仓库
  • Vue 中使用 Less 样式预处理
  • 大语言模型框架-Megatron-LM 源码分析
  • CSS 子元素选择器
  • Webpack Loader 一览表
  • ThinkPHP 5.1 环境安装与配置指南
  • Ubuntu SSH 服务安装与配置详解
  • 云原生容器技术入门:Docker 与 K8s 基本原理及用途
  • CSS 常用标签与属性详解
  • WebLogic MIB 与 AdventNet MIB Browser 工具使用指南

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online