LeetCode | 最长回文子串

368 字
2 分钟
LeetCode | 最长回文子串

分类:双指针/字符串

题目#

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

如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。

示例 1:

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

示例 2:

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

讲解#

回文串以中心向两侧对称,所以枚举每个位置当中心,向两边扩展比较。

关键点:回文中心有两种——奇数长度是单个字符 (i, i),偶数长度是相邻两字符中间 (i, i + 1)。两种都要试。

expand(left, right) 从中心向两侧扩展,只要左右字符相等就继续外扩,直到不相等或越界。因为循环结束时左右指针已经多走了一步,所以切片取 s[left + 1:right]

说明: 官方分类在多维动态规划。我这种题解是双指针。

复杂度#

  • 中心扩展法:
    • 时间复杂度:O(n^2)
    • 空间复杂度:O(1)

代码#

源码#

class Solution:
def longestPalindrome(self, s: str) -> str:
def expand(left: int, right: int) -> str:
while left >= 0 and right < len(s) and s[left] == s[right]:
left -= 1
right += 1
return s[left + 1:right]
ans = ""
for i in range(len(s)):
odd = expand(i, i)
even = expand(i, i + 1)
ans = max(ans, odd, even, key=len)
return ans

测试#

sol = Solution()
assert sol.longestPalindrome("babad") in ("bab", "aba")
assert sol.longestPalindrome("cbbd") == "bb"
assert sol.longestPalindrome("a") == "a"
assert sol.longestPalindrome("ac") == "a"
print("PASS")

参考资料#

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

LeetCode | 最长回文子串
https://leetcode.cn/problems/longest-palindromic-substring/
作者
平昊阳
发布于
2026-08-21
许可协议
CC BY-NC-SA 4.0

评论区

Profile Image of the Author
平昊阳
乘长风,破巨浪, 展鸿图于未央!
--
总访问量
--
访客数
公告
欢迎来到我的个人博客!欢迎关注交流吖!
更多相关公告,见
社交-留言」。
音乐
封面

音乐

暂未播放

0:000:00
暂无歌词
站点统计
文章
66
分类
16
标签
93
总字数
477,284
运行时长
0
最后活动
0 天前

文章目录