📌  相关文章
📜  每个索引的最大长度回文子串,使其在该索引处开始和结束(1)

📅  最后修改于: 2023-12-03 15:26:53.639000             🧑  作者: Mango

介绍:回文子串

回文子串是指一个字符串中,从左往右和从右往左读取都一样的字符串。找出一个字符串中所有的回文子串是一个常见的算法问题。

在本篇文章中,我们将讨论如何寻找一个字符串中每个索引处的最大长度回文子串。即,我们要找到一个字符串中以每个索引为中心的最长回文子串。

解法:中心扩展法

中心扩展法(或者称为枚举中心法)是解决这个问题的一种常见解法,它的基本思路是从每个字符或者相邻的字符中选定一个中心(或者两个中心),然后向两边扩展,直到不能扩展为止。

具体来说,我们可以遍历字符串,对于每个字符 i,以它为中心,向左右两边同时扩展,直到左右两边的字符不同或者越界为止。最后,这个字符 i 所对应的最长回文子串的长度就是扩展的长度-1。因为扩展的长度包含了中心字符本身。

时间复杂度为 $O(n^2)$,空间复杂度为 $O(1)$。其中,n 表示字符串的长度。

实现示例

以下是使用中心扩展法解决这个问题的 Python 示例代码:

class Solution:
    def longestPalindrome(self, s: str) -> str:
        def expand(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]
        
        if len(s) < 2 or s == s[::-1]:
            return s
        
        longest = ''
        for i in range(len(s) - 1):
            odd = expand(i, i)
            even = expand(i, i+1)
            cur = odd if len(odd) > len(even) else even
            if len(cur) > len(longest):
                longest = cur
        return longest

以上代码中,我们定义了一个内部函数 expand(left: int, right: int) -> str,用来从一个中心向两边扩展,以寻找回文子串。

首先,我们判断一下特殊情况:当字符串的长度小于 2 的时候,或者字符串本身就是回文的时候,直接返回该字符串。这是因为如果一个字符串长度小于 2 或者本身就是回文的话,它的每个索引处最大长度回文子串就是它自己。

然后,我们遍历字符串,对于每个位置 i,计算以它为中心,向左右扩展的最长回文子串。最后,我们把最长的回文子串返回即可。

总结

中心扩展法是一种简单、直观、易于理解的寻找回文子串的方法。虽然时间复杂度较高,但对于短字符串而言效率依然较高。在实际生产环境中也比较常用。