LC 5动态规划中等第 85 / 95 题

最长回文子串

Longest Palindromic Substring

动态规划中心扩展
本机进度仅保存在当前浏览器

题目描述

给你一个字符串 s,找到 s 中最长的回文子串(正读反读相同的连续子串)。

示例:s = "babad",输出 "bab"(或 "aba");s = "cbbd",输出 "bb"。

解题思路

  1. 中心扩展法最直观:回文由中心向两侧对称,枚举 2n - 1 个中心(每个字符 + 每对相邻字符间),向两侧扩展记录最长。
  2. 偶长度回文没有单一字符中心,所以相邻两字符相等也要作为一类中心处理。
  3. DP 解法 dp[i][j] 表示 s[i..j] 是否回文,转移看 s[i] == s[j] 且内部回文,空间 O(n^2);中心扩展空间 O(1) 更优。

参考实现

查看参考实现Python · 建议先自行作答
def longestPalindrome(s):
    def expand(l, r):
        # 由中心向两侧扩展,返回回文半径内区间
        while l >= 0 and r < len(s) and s[l] == s[r]:
            l -= 1
            r += 1
        return l + 1, r - 1

    best_l, best_r = 0, 0
    for i in range(len(s)):
        for l, r in (expand(i, i), expand(i, i + 1)):
            if r - l > best_r - best_l:
                best_l, best_r = l, r
    return s[best_l:best_r + 1]

复杂度与归属

时间复杂度O(n^2)
空间复杂度O(1)
所属分类动态规划
题源LeetCode 5

关联教程

返回题图鉴