题目:
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例 1:
输入: “babad”
输出: “bab”
注意: “aba” 也是一个有效答案。
示例 2:
输入: “cbbd”
输出: “bb”
python解法
class Solution(object):
def longestPalindrome(self, s):
"""
:type s: str
:rtype: str
"""
if s=='' or len(s)<1:
return ''
start=0
end=0
length=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-int((length-1)/2)
end=i+int((length)/2)
return s[start:end+1]
@staticmethod
def expandAroundCenter(s,left,right):
l,r=left,right
while (l>=0 and r<len(s) and s[l]==s[r]):
l=l-1
r=r+1
return r-l-1
思路:
中心扩展算法
观察到回文中心的两侧互为镜像。因此,回文可以从它的中心展开,并且只有 2n - 1个这样的中心。
你可能会问,为什么会是 2n - 1个,而不是 n个中心?原因在于所含字母数为偶数的回文的中心可以处于两字母之间(例如 “abba” 的中心在两个 ‘b’ 之间)。
复杂度分析
时间复杂度:O(
n
2
n^2
n2),由于每一次围绕中心来扩展回文会耗去 O(n)的时间,所以总的复杂度为 O(
n
2
n^2
n2) 。
空间复杂度:O(1)。