数据结构与算法之 leetcode 字符串回文子串算法 中心扩展法

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


字符串回文子串算法:中心扩展法在LeetCode中的应用

在编程领域,字符串回文子串是一个经典的问题。回文子串是指一个字符串中,从某个位置开始,向两边扩展,能够完全对称的子串。例如,在字符串“abba”中,“bb”和“abba”都是回文子串。在LeetCode等编程竞赛平台中,字符串回文子串问题经常出现,其核心在于如何高效地找出所有的回文子串。

本文将围绕字符串回文子串算法中的中心扩展法进行探讨,并给出相应的LeetCode题目解析和代码实现。中心扩展法是一种简单而高效的算法,通过以每个字符为中心,向两边扩展来检查回文子串。

中心扩展法原理

中心扩展法的基本思想是:对于字符串中的每个字符(或字符对),将其视为可能的回文子串的中心,然后向两边扩展,检查扩展后的子串是否为回文。

单个字符中心

对于单个字符,如果它是回文子串的中心,那么它左右两侧的字符必须相同。我们可以从中心向两边扩展,直到遇到不同的字符或者边界。

字符对中心

对于字符对,如果它们是回文子串的中心,那么它们之间的所有字符必须相同。我们可以从字符对向两边扩展,直到遇到不同的字符或者边界。

LeetCode题目解析

在LeetCode上,关于字符串回文子串的问题有很多,以下是一个典型的例子:

题目描述:给定一个字符串,找出其中所有的回文子串。

示例:


输入: "babad"


输出: ["bab", "aba"]


代码实现

以下是用Python语言实现的中心扩展法代码:

python

def palindrome_substrings(s: str) -> list:


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


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


left -= 1


right += 1


return s[left + 1:right]

result = set()


for i in range(len(s)):


以单个字符为中心的回文子串


result.add(expand_around_center(i, i))


以字符对为中心的回文子串


if i + 1 < len(s):


result.add(expand_around_center(i, i + 1))

return list(result)

测试代码


s = "babad"


print(palindrome_substrings(s))


优化与总结

在上述代码中,我们使用了`set`来存储回文子串,以避免重复。我们通过`expand_around_center`函数来处理单个字符和字符对的中心扩展。

优化方向

1. 空间优化:如果只需要返回回文子串的数量而不是具体的子串,可以省略`set`的使用,直接计数。

2. 时间优化:对于某些特定的字符串,可以提前终止扩展过程,例如当左右两侧的字符不同时。

总结

中心扩展法是一种简单而高效的算法,适用于解决字符串回文子串问题。通过以每个字符为中心,向两边扩展,我们可以快速找出所有的回文子串。在LeetCode等编程竞赛平台中,掌握这种算法对于解决字符串回文子串问题非常有帮助。

本文详细介绍了字符串回文子串算法中的中心扩展法,并给出了相应的LeetCode题目解析和代码实现。通过学习本文,读者可以更好地理解中心扩展法的原理,并在实际编程中灵活运用。希望本文对读者有所帮助。