当前位置:首页>python>Python教程:找到字符串中最长回文子串(上海自来水来自海上)

Python教程:找到字符串中最长回文子串(上海自来水来自海上)

  • 2026-10-11 08:30:32
Python教程:找到字符串中最长回文子串(上海自来水来自海上)

Python,速成心法

敲代码,查资料,问Ai

练习,探索,总结,优化

★★★★★博文创作不易,源码代码的过程中,如有疑问的地方,欢迎大家指正留言交流。喜欢的老铁可以多多点赞+收藏分享+置顶,小红牛在此表示感谢。★★★★★

Python打包教程07:还不会用--add-data参数,添加资源文件吗?

Python打包教程04:UPX安装与使用(减小.exe体积)

Python打包教程03:PyInstaller命令使用指南

Python查询CPU+硬盘+网卡MAC +主板+BIOS序列号

Python教程:PyCharm安装过程中遇到的中英文对照表

和Python编程相关的,中英文对照词汇表

2025年Python和pycharm安装下载教程

Python教程110:单线程和多线程源码演示(threading)

Python教程108:针对面向对象Class类知识要点,源码示例再演示。

Python入门教程04:流程控制语句(if+for+continue等)

Python入门教程10:datetime模块的示例用法

Python入门教程02:常用的内置函数示例演示

200条Python零基础自学指南

Python零基础教程:小白入门自学知识点大纲

Python教程:Py模块导入方法详解

Python教程:3种格式符(str.format()+f-string+%)的常见用法

题目描述:给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
回文:正着读和反着读都一样的字符串。
输入: "babad"输出: "bab"  # 注:"aba" 也是一个有效答案
思路说明
1.中心扩展法:回文字符串的中心可能是一个字符(奇数长度)或两个相同字符的中间(偶数长度)。
对于每个可能中心,向左右两端扩展,直到遇到不相等字符,记录回文长度。
2.遍历所有中心:总共 2n - 1 个中心(n 个单字符中心和 n-1 个双字符中心)。每次扩展的时间复杂度为 O(n),总体 O(n²)。
3.动态规划解法(备选):用二维 DP 表 dp[i][j] 表示子串 s[i:j+1] 是否回文,状态转移 dp[i][j] = (s[i]==s[j]) and (j-i<2 or dp[i+1][j-1])。
时间复杂度 O(n²),空间复杂度 O(n²)(可优化至 O(n))。
4.Manacher 算法(进阶):可达到 O(n) 时间,但实现较复杂,适用于面试中的拓展讨论。
该解法满足中等难度要求,易于理解且效率合格。

↓ 完整源码如下 ↓

# -*- coding: utf-8 -*-# @Author : 小红牛# 微信公众号:wdPythondef longest_palindrome(s: str) -> str:    """    返回 s 中最长回文子串。    参数:        s: 输入字符串    返回:        str: 最长回文子串    """    if not s:        return ""    start = 0   # 最长回文子串的起始索引    max_len = 1 # 最长回文子串的长度(至少为1)    def expand_around_center(left: int, right: int):        """从中心向两边扩展,返回当前扩展后的回文长度"""        nonlocal start, max_len        while left >= 0 and right < len(s) and s[left] == s[right]:            left -= 1            right += 1        # 退出循环时,s[left+1:right] 是回文,长度为 (right-1) - (left+1) + 1 = right - left - 1        length = right - left - 1        if length > max_len:            max_len = length            start = left + 1    for i in range(len(s)):        # 奇数长度回文:中心是一个字符        expand_around_center(i, i)        # 偶数长度回文:中心是两个相同字符之间        expand_around_center(i, i + 1)    return s[start:start + max_len]# 测试用例if __name__ == "__main__":    print(longest_palindrome("babad"))  # "bab" 或 "aba"    print(longest_palindrome("cbbd"))   # "bb"    print(longest_palindrome("a"))      # "a"    print(longest_palindrome("ac"))     # "a" 或 "c"    print(longest_palindrome("我们家的上海自来水来自海上"))       # 上海自来水来自海上    print(longest_palindrome("abcba"))  # "abcba"    print(longest_palindrome("abaxabax")) # "abaxaba" (或类似)

完毕!!感谢您的收看

------★★历史博文集合★★------

Python入门篇  进阶篇  视频教程  Py安装

py项目Python模块 Python爬虫  Json

Xpath正则表达式SeleniumEtreeCss

Gui程序开发TkinterPyqt5 列表元组字典

数据可视化   matplotlib   词云图Pyecharts

海龟画图PandasBug处理电脑小知识

自动化脚本编程工具NumPy CSVWeb

Pygame  图像处理  机器学习数据库

最新文章

随机文章