最长回文子串(中心扩展法)
字数 1084 2025-12-11 19:15:19

最长回文子串(中心扩展法)

题目描述:
给定一个字符串 s,找到 s 中最长的回文子串。回文串是正着读和反着读都一样的字符串。你需要返回这个最长回文子串。如果存在多个最长回文子串,返回任意一个即可。
示例:
输入:s = "babad"
输出:"bab" 或 "aba"
输入:s = "cbbd"
输出:"bb"

解题过程(中心扩展法):
核心思路是枚举所有可能的回文中心,然后向两边扩展,直到无法扩展为止。由于回文串长度可能是奇数(中心是一个字符)或偶数(中心是两个字符),因此需要分别处理。

步骤分解:

  1. 初始化两个变量记录最长回文子串的起始位置和长度:start = 0, maxLen = 1。
  2. 遍历字符串 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,同样条件扩展。
    扩展结束后,更新最大长度和起始位置(如果当前长度更大)。
  3. 遍历结束后,根据 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"。
最长回文子串(中心扩展法) 题目描述: 给定一个字符串 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"。