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

数据结构与算法阿木 发布于 3 天前 1 次阅读


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

在字符串处理领域,回文子串是一个重要的概念。回文子串是指一个字符串中,从某个位置开始,向两边扩展,能够完全对称的子串。例如,在字符串“abba”中,“bb”和“abba”都是回文子串。在LeetCode等编程竞赛平台中,字符串回文子串的统计是一个常见的题目。本文将围绕这一主题,介绍一种有效的算法——中心扩展法,并展示其在LeetCode中的应用。

中心扩展法简介

中心扩展法是一种用于查找字符串中所有回文子串的算法。其基本思想是:对于字符串中的每一个字符(或字符对),将其视为回文子串的中心,然后向两边扩展,检查扩展后的子串是否为回文。如果为回文,则将其计入结果中。

中心扩展法可以分为两种情况:

1. 对于奇数长度的回文子串,中心是一个字符。

2. 对于偶数长度的回文子串,中心是两个相邻的字符。

下面将详细介绍中心扩展法的实现过程。

代码实现

以下是一个使用Python语言实现的中心扩展法统计字符串回文子串的示例代码:

python

def count_palindromic_substrings(s: str) -> int:


n = len(s)


count = 0


for i in range(n):


以字符为中心扩展


count += expand_around_center(s, i, i)


以字符对为中心扩展


if i < n - 1:


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


return count

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


count = 0


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


count += 1


left -= 1


right += 1


return count

测试代码


s = "abba"


print(count_palindromic_substrings(s)) 输出:6


LeetCode题目分析

在LeetCode平台上,有许多与字符串回文子串相关的题目。以下列举几个典型的题目:

1. 5. 最长回文子串(LeetCode 5)

- 题目描述:给定一个字符串,找出它的最长回文子串。

- 难度:中等

- 解题思路:使用中心扩展法,遍历字符串中的每个字符,将其视为中心,向两边扩展,找到最长的回文子串。

2. 647. 回文子串数量(LeetCode 647)

- 题目描述:给定一个字符串,返回该字符串中所有回文子串的数量。

- 难度:中等

- 解题思路:使用中心扩展法,遍历字符串中的每个字符,将其视为中心,向两边扩展,统计所有回文子串的数量。

3. 131. 分割回文串(LeetCode 131)

- 题目描述:给定一个字符串,将其分割成尽可能多的回文子串,并返回所有可能的分割方案。

- 难度:困难

- 解题思路:使用中心扩展法,遍历字符串中的每个字符,将其视为中心,向两边扩展,找到所有回文子串。然后使用动态规划或回溯算法,找到所有可能的分割方案。

总结

中心扩展法是一种高效且易于实现的算法,可以用于统计字符串中的回文子串。在LeetCode等编程竞赛平台中,掌握中心扩展法对于解决字符串回文子串相关题目具有重要意义。本文通过介绍中心扩展法的基本原理和代码实现,以及其在LeetCode中的应用,希望能帮助读者更好地理解和掌握这一算法。