📅  最后修改于: 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,计算以它为中心,向左右扩展的最长回文子串。最后,我们把最长的回文子串返回即可。
中心扩展法是一种简单、直观、易于理解的寻找回文子串的方法。虽然时间复杂度较高,但对于短字符串而言效率依然较高。在实际生产环境中也比较常用。