描述:
输入字符串s,找出s中包含的最长回文子串
例:
输入:“abacd” 输出:”aba“
输入:”abbc“ 输出:“bb”
输入:“aaaa” 输出:“aaaa”
基本思想:
首先往左寻找与当前位置相同的字符,直到超出左侧索引范围或遇到不相等的字符为止。
然后往右寻找与当前位置相同的字符,直到超出右侧索引范围或遇到不相等的字符为止。
最后左右双向扩散,直到超出索引范围或左右字符不相等为止。
代码如下:
def longest_palindrome(s: str) -> str:
max_left = 0 # 最长回文串起点
max_right = 0 # 最长回文串终点
max_len = 0 # 最长回文串长度
for i in range(len(s)):
mid = i # 回文串中心
left = mid - 1 # 当前回文串起点
right = mid + 1 # 当前回文串终点
length = 1 # 当前回文串长度
# 向左扩散,寻找以当前字符为中心的偶数长度的回文串
while left >= 0 and s[left] == s[mid]:
left -= 1
length += 1
# 向右扩散,寻找以当前字符为中心的偶数长度的回文串
while right < len(s) and s[mid] == s[right]:
right += 1
length += 1
# 双向扩散,寻找以当前字符为中心的奇数长度的回文串
while left >= 0 and right < len(s) and s[left] == s[right]:
left -= 1
right += 1
length += 2
if length > max_len:
max_left = left
max_right = right
max_len = length
return s[max_left + 1: max_right]