給定一個字符串 s,找出其中最長的迴文子字符串,假設 s 的最大長度爲 1000。python
例 1:bash
輸入: "babad"
輸出: "bab"
注意: "aba" 也是正確的答案
複製代碼
例 2:spa
Input: "cbbd"
Output: "bb"
複製代碼
Medium
code
注意到迴文的對稱性特色,咱們只須要在遍歷 s 的過程當中,假設每個字符都是迴文的中心,對於每個迴文中心,咱們不斷向兩邊擴展,同時檢測其對稱性,找出該回文的邊界,並記錄其長度,最終,當遍歷完 s 以後,咱們便檢測了 s 中全部的迴文,固然就能夠獲得 s 中最長的迴文子字符串。這種方法的時間複雜度爲 。leetcode
須要注意的是,迴文有兩種形式:單中心和雙中心,因此咱們在遍歷每一個字符時,不只要把當前字符當作單中心迴文的中心,還要將當前字符和下一個字符當作雙中心迴文的中心,並分別以這兩個中心向兩邊擴展。字符串
所有代碼以下:get
class Solution():
def expand(self, left, right, s):
""" expand from middle point """
if right >= len(s) or s[left] != s[right]:
return 0
while left-1 >= 0 and right+1 < len(s) and s[left-1] == s[right+1]:
left -= 1
right += 1
return right + 1 - left
def longest_palindrome(self, s):
""" :type s: str :rtype: str """
if not s:
return ""
middle = 0
max_len = 0
for i in range(len(s)):
len1 = self.expand(i, i, s)
len2 = self.expand(i, i+1, s)
longer = max(len1, len2)
if longer > max_len:
max_len = longer
middle = i
begin = middle-int((max_len-1)/2)
return s[begin:begin+max_len]
複製代碼