📅  最后修改于: 2023-12-03 15:12:44.792000             🧑  作者: Mango
门(GATE-IT-2004)的问题26给定了一个字符串,要求我们找出其中最长的回文子串。 回文字符串是指正着和倒着读都一样的字符串。
要找到最长的回文子串,一种自然的思路是枚举所有子串并且判断其是否是回文。这样做时间复杂度是 $O(n^3)$。不过我们可以利用回文字符串的特点,从中心扩展出去的方法来降低时间复杂度。时间复杂度是 $O(n^2)$。
我们可以从一个字符或两个字符开始,判断以这个字符或两个字符为中心的最长回文子串。这样我们可以得到一个长度为奇数的回文字符串和一个长度为偶数的回文字符串。然后就可以比较两者长短,取得最长的回文子串了。
下面是用 Python 3 实现的代码片段。代码实现过程中有详细的注释。
def longest_palindrome(s: str) -> str:
n = len(s)
if n < 2:
return s
# 初始化最长回文子串的起点和终点
start, end = 0, 0
for i in range(n - 1):
# 计算长度为奇数的回文子串
left, right = i, i
while left >= 0 and right < n and s[left] == s[right]:
left -= 1
right += 1
if right - left - 1 > end - start:
start, end = left + 1, right - 1
# 计算长度为偶数的回文子串
left, right = i, i + 1
while left >= 0 and right < n and s[left] == s[right]:
left -= 1
right += 1
if right - left - 1 > end - start:
start, end = left + 1, right - 1
# 通过起点和终点得到最长回文子串
return s[start:end+1]
本题中最长回文子串是字符串问题中比较常见的问题,常用的解法是中心扩展法。时间复杂度为 $O(n^2)$,空间复杂度为 $O(1)$。