最长回文子串(中心扩展法)
字数 566 2025-11-02 00:38:37
最长回文子串(中心扩展法)
题目描述:
给定一个字符串s,找到s中最长的回文子串。回文串是正着读和反着读都一样的字符串。
示例:
输入:s = "babad"
输出:"bab"或"aba"
解题过程:
-
问题分析
回文串有一个重要特性:中心对称性。这意味着每个回文串都有一个中心,从这个中心向两边扩展时,两边的字符总是相同的。 -
中心点的选择
对于一个长度为n的字符串,可能的中心点有2n-1个:
- 以单个字符为中心(n个)
- 以两个字符之间的空隙为中心(n-1个)
- 动态规划思路
定义函数expandAroundCenter(left, right),表示以left和right为起始点向两边扩展:
- 当left和right指向的字符相同时,继续向两边扩展
- 直到字符不同或到达边界时停止
- 算法步骤
初始化maxLen = 0, start = 0
遍历每个可能的中心点i(0到n-1):
// 情况1:以单个字符为中心(奇数长度)
len1 = expandAroundCenter(i, i)
// 情况2:以两个字符之间的空隙为中心(偶数长度)
len2 = expandAroundCenter(i, i+1)
// 取两种情况中的较大值
currentLen = max(len1, len2)
// 更新最长回文子串信息
if currentLen > maxLen:
maxLen = currentLen
start = i - (currentLen - 1) // 2
返回s.substring(start, start + maxLen)
- 扩展函数实现
expandAroundCenter(left, right):
while left >= 0 and right < n and s[left] == s[right]:
left--
right++
return right - left - 1
- 时间复杂度分析
- 每个中心点最多扩展n次
- 总共有2n-1个中心点
- 时间复杂度:O(n²)
- 空间复杂度:O(1)
- 示例演示
以s = "babad"为例:
- i=0:中心'b',扩展得到"b"(len=1)
- i=1:中心'a',扩展得到"aba"(len=3)
- i=2:中心'b',扩展得到"bab"(len=3)
- 最终找到长度为3的回文子串"aba"或"bab"
这种方法比暴力解法更高效,利用了回文串的对称性质,避免了重复计算。