原題:給定一個字符串 s,找到 s 中最長的迴文子串。你可以假設 s 的最大長度爲 1000。
示例 1:
輸入: "babad"
輸出: "bab"
注意: "aba" 也是一個有效答案。
示例 2:
輸入: "cbbd"
輸出: "bb"
解法一:(中心擴展法)
思路:我假設每個字符都是迴文字符串的中心。以這個字符向兩邊搜索,如果正好形成迴文字符串就使用end和start記錄位置,同時記錄迴文字符串的長度,選取最長的迴文字符串。
class Solution(object):
def longestPalindrome(self, s):
"""
:type s: str
:rtype: str
"""
if len(s) < 2 : # 特殊字符串先返回
return ""
start = 0
end = 0
for i in range(len(s)): # 遍歷字符串
len1 = self.expandAroundCenter(s, i, i);
len2 = self.expandAroundCenter(s, i, i + 1);
length = max(len1, len2) # 找出字符相同的長度
if length > end - start:
start = i - (length - 1) / 2
end = i + length / 2
return s[start:end + 1]
def expandAroundCenter(self,s, left,right) :
L = left
R = right
while L >= 0 and R < len(s) and s[L] == s[R]: # 向兩邊不斷的擴展
L -=1
R +=1
return R - L - 1
解法二:(動態數組)
class Solution(object):
def longestPalindrome(self, s):
"""
:type s: str
:rtype: str
"""
size = len(s)
if size <1:
return ""
dp = [[False for _ in range(size)] for _ in range(size)]
longest_l = 1 # 記錄迴文子串的長度
res = s[0]
for r in range(1, size):
for l in range(r):
if s[l] == s[r] and (r - l <= 2 or dp[l + 1][r - 1]):
dp[l][r] = True
cur_len = r - l + 1
if cur_len > longest_l:
longest_l = cur_len
res = s[l:r + 1]
return res