最长回文子串(中心扩展法)
字数 566 2025-11-02 00:38:37

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

题目描述:
给定一个字符串s,找到s中最长的回文子串。回文串是正着读和反着读都一样的字符串。

示例:
输入:s = "babad"
输出:"bab"或"aba"

解题过程:

  1. 问题分析
    回文串有一个重要特性:中心对称性。这意味着每个回文串都有一个中心,从这个中心向两边扩展时,两边的字符总是相同的。

  2. 中心点的选择
    对于一个长度为n的字符串,可能的中心点有2n-1个:

  • 以单个字符为中心(n个)
  • 以两个字符之间的空隙为中心(n-1个)
  1. 动态规划思路
    定义函数expandAroundCenter(left, right),表示以left和right为起始点向两边扩展:
  • 当left和right指向的字符相同时,继续向两边扩展
  • 直到字符不同或到达边界时停止
  1. 算法步骤
初始化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)
  1. 扩展函数实现
expandAroundCenter(left, right):
    while left >= 0 and right < n and s[left] == s[right]:
        left--
        right++
    return right - left - 1
  1. 时间复杂度分析
  • 每个中心点最多扩展n次
  • 总共有2n-1个中心点
  • 时间复杂度:O(n²)
  • 空间复杂度:O(1)
  1. 示例演示
    以s = "babad"为例:
  • i=0:中心'b',扩展得到"b"(len=1)
  • i=1:中心'a',扩展得到"aba"(len=3)
  • i=2:中心'b',扩展得到"bab"(len=3)
  • 最终找到长度为3的回文子串"aba"或"bab"

这种方法比暴力解法更高效,利用了回文串的对称性质,避免了重复计算。

最长回文子串(中心扩展法) 题目描述: 给定一个字符串s,找到s中最长的回文子串。回文串是正着读和反着读都一样的字符串。 示例: 输入:s = "babad" 输出:"bab"或"aba" 解题过程: 问题分析 回文串有一个重要特性:中心对称性。这意味着每个回文串都有一个中心,从这个中心向两边扩展时,两边的字符总是相同的。 中心点的选择 对于一个长度为n的字符串,可能的中心点有2n-1个: 以单个字符为中心(n个) 以两个字符之间的空隙为中心(n-1个) 动态规划思路 定义函数expandAroundCenter(left, right),表示以left和right为起始点向两边扩展: 当left和right指向的字符相同时,继续向两边扩展 直到字符不同或到达边界时停止 算法步骤 扩展函数实现 时间复杂度分析 每个中心点最多扩展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" 这种方法比暴力解法更高效,利用了回文串的对称性质,避免了重复计算。