最长回文子串(中心扩展法)
字数 1084 2025-12-11 19:15:19
最长回文子串(中心扩展法)
题目描述:
给定一个字符串 s,找到 s 中最长的回文子串。回文串是正着读和反着读都一样的字符串。你需要返回这个最长回文子串。如果存在多个最长回文子串,返回任意一个即可。
示例:
输入:s = "babad"
输出:"bab" 或 "aba"
输入:s = "cbbd"
输出:"bb"
解题过程(中心扩展法):
核心思路是枚举所有可能的回文中心,然后向两边扩展,直到无法扩展为止。由于回文串长度可能是奇数(中心是一个字符)或偶数(中心是两个字符),因此需要分别处理。
步骤分解:
- 初始化两个变量记录最长回文子串的起始位置和长度:start = 0, maxLen = 1。
- 遍历字符串 s 的每个位置 i,作为可能的回文中心:
a. 奇数长度回文:以 s[i] 为中心,向左右扩展。
初始化左右指针 left = i, right = i,当 left >= 0 且 right < n 且 s[left] == s[right] 时,向两边扩展:left--, right++。
扩展结束后,当前回文长度为 right - left - 1,如果大于 maxLen,则更新 maxLen 和 start(start = left + 1)。
b. 偶数长度回文:以 s[i] 和 s[i+1] 为中心,向左右扩展。
初始化 left = i, right = i + 1,同样条件扩展。
扩展结束后,更新最大长度和起始位置(如果当前长度更大)。 - 遍历结束后,根据 start 和 maxLen 返回子串 s[start:start+maxLen]。
为什么这样做正确?
- 中心扩展法利用了回文串的对称性,从中心向外逐个字符比对,确保找到以每个中心为起点的最长回文。
- 由于中心点有 2n-1 个(n 个字符位置和 n-1 个字符间隙),每个中心扩展最多 O(n) 次,总时间复杂度 O(n²),空间复杂度 O(1)。
- 它避免了动态规划中 O(n²) 的额外空间,更简洁直观。
示例演练(s = "babad"):
- i=0:奇数扩展,中心 'b',左右扩展 0 位,长度 1。偶数扩展中心 'ba',不匹配。
- i=1:奇数扩展,中心 'a',左 'b' 右 'a' 不匹配,长度 1。偶数扩展中心 'ab',不匹配。
- i=2:奇数扩展,中心 'b',左 'a' 右 'a' 匹配,继续左 'b' 右 'd' 不匹配,得到 "bab",长度 3,更新 start=0, maxLen=3。
- 继续遍历,最终得到 "bab"。