字符串中最长回文子串长度的求解:中心扩展法 | 豆包MarsCode AI刷题

162 阅读4分钟

在字符串处理的领域中,寻找最长回文子串是一个经典且有趣的问题。它在许多实际应用场景中都有重要意义,比如文本分析、模式识别等。本文将详细阐述如何通过中心扩展法来解决这一问题,包括算法思路、代码实现和最终总结。

一、问题引入与回文子串概念

在我们的问题中,给定一个字符串s,我们需要找出其中最长的回文子串的长度。回文子串是一种特殊的字符串,它具有从左到右和从右到左字符顺序完全相同的特性。例如,“aba”、“racecar” 都是典型的回文子串。理解这个概念是解决问题的基础,因为我们的算法核心就是围绕着回文的这一性质展开的。

二、解题思路:中心扩展法

为了找到最长回文子串的长度,我们采用中心扩展法。其基本思路如下:

  • 遍历字符串中的每一个字符,因为每个字符都有可能是回文子串的中心。
  • 由于回文子串长度有奇数和偶数两种情况,所以对于每个字符,我们需要分别考虑以它为中心的奇数长度回文和以它及它下一个字符为中心的偶数长度回文
  • 从选定的中心向两边扩展,检查是否能构成回文子串。

三、算法步骤与代码实现

(一)初始化

我们使用 Python 实现这个算法,首先定义一个函数solution(s: str) -> int。在函数内部,我们初始化一个变量max_length来记录最长回文子串的长度,初始值设为 0。

def solution(s: str) -> int:
    max_length = 0

(二)遍历字符串

使用for循环遍历字符串s中的每一个字符。

for i in range(len(s)):

(三)中心扩展

我们定义了一个辅助函数expand_around_center(left: int, right: int) -> int来实现中心扩展。这个函数从给定的中心点leftright向两边扩展,检查是否形成回文子串。在函数内部,通过while循环来实现这个过程。只要left不小于 0(保证不超出字符串左边界)、right小于字符串长度(保证不超出右边界),并且s[left]等于s[right](这是回文的关键条件),就将left减 1,right加 1。当不满足这些条件时,循环结束,返回right - left - 1,这个值就是当前找到的回文子串的长度。

def expand_around_center(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

(四)更新最长回文子串的长度

在遍历字符串的过程中,对于每个字符i,我们分别检查奇数长度和偶数长度的回文子串。对于奇数长度,调用expand_around_center(i, i)得到长度len1;对于偶数长度,调用expand_around_center(i, i + 1)得到长度len2。然后使用max函数更新max_length,使其始终保持为当前找到的最长回文子串的长度。

for i in range(len(s)):
    len1 = expand_around_center(i, i)
    len2 = expand_around_center(i, i + 1)
    max_length = max(max_length, len1, len2)

(五)测试代码

if __name__ == '__main__':部分,我们对函数进行了简单的测试。

if __name__ == '__main__':
    print(solution("abcbadb") == 5)
    print(solution("ababacab") == 5)
    print(solution("racecarwk") == 7)

四、总结

通过中心扩展法,我们成功地解决了寻找字符串中最长回文子串长度的问题。这个算法的核心在于仔细考虑了回文子串长度的奇偶性,并通过遍历字符串的每个字符作为可能的中心进行扩展检查。代码实现中,expand_around_center函数清晰地实现了从中心向两边扩展检查回文的功能,而主函数solution通过巧妙地调用这个辅助函数和更新最长长度变量,确保了算法的正确性。这种方法在处理字符串回文相关问题上具有较高的效率和可读性,为解决更复杂的字符串处理问题提供了一个良好的思路。同时,测试代码部分验证了算法在不同输入字符串情况下的正确性,增强了我们对算法的信心。总之,中心扩展法是解决最长回文子串长度问题的一种有效方法。