数据结构与算法之 leetcode 动态规划最长回文子串算法 中心扩展

数据结构与算法阿木 发布于 2025-07-12 12 次阅读


动态规划与中心扩展:解决LeetCode最长回文子串问题

在算法和数据结构的学习过程中,动态规划(Dynamic Programming,DP)是一种非常强大的技术。它通过将复杂问题分解为更小的子问题,并存储这些子问题的解,从而避免重复计算,提高算法效率。在LeetCode等编程竞赛平台中,动态规划问题非常常见。本文将围绕动态规划解决LeetCode上的“最长回文子串”问题,介绍中心扩展法,并详细解析代码实现。

问题分析

“最长回文子串”问题要求在一个字符串中找出最长的回文子串。回文串是指正读和反读都相同的字符串。例如,字符串“abba”是一个回文串,而“abcd”则不是。

动态规划法

传统的动态规划法通过构建一个二维数组dp,其中dp[i][j]表示字符串中从索引i到j的子串是否为回文串。具体实现如下:

1. 初始化一个二维数组dp,大小为n×n,其中n为字符串长度。

2. 遍历字符串的所有子串,对于每个子串,判断其是否为回文串,并更新dp数组。

3. 遍历dp数组,找到最大的回文子串长度。

这种方法的时间复杂度为O(n^2),空间复杂度为O(n^2)。

中心扩展法

中心扩展法是一种更高效的方法,它通过以每个字符为中心,向两边扩展来寻找回文子串。这种方法的时间复杂度为O(n^2),但空间复杂度可以降低到O(1)。

代码实现

以下是用中心扩展法解决“最长回文子串”问题的Python代码实现:

python

def longest_palindromic_substring(s: str) -> str:


if not s:


return ""



start, end = 0, 0



for i in range(len(s)):


扩展奇数长度的回文子串


len1 = expand_around_center(s, i, i)


扩展偶数长度的回文子串


len2 = expand_around_center(s, i, i + 1)


max_len = max(len1, len2)



if max_len > end - start:


start = i - (max_len - 1) // 2


end = i + max_len // 2



return s[start:end + 1]

def expand_around_center(s: str, left: int, right: int) -> int:


while left >= 0 and right < len(s) and s[left] == s[right]:


left -= 1


right += 1


返回回文子串的长度


return right - left - 1


代码解析

1. `longest_palindromic_substring`函数:遍历字符串中的每个字符,以该字符为中心,向两边扩展,寻找回文子串。更新最大回文子串的起始和结束索引。

2. `expand_around_center`函数:以给定字符为中心,向两边扩展,判断是否为回文子串。返回回文子串的长度。

总结

本文介绍了动态规划与中心扩展法解决LeetCode上的“最长回文子串”问题。中心扩展法具有时间复杂度和空间复杂度较低的优势,是一种高效解决该问题的方法。在实际应用中,可以根据具体问题选择合适的算法,提高代码效率。