原题:给定一个字符串 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