给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例1:
输入: “babad”
输出: “bab”
注意: “aba” 也是一个有效答案。
示例2:
输入: “cbbd”
输出: “bb”
class Solution(object):
def longestPalindrome(self, s):
"""
:type s: str
:rtype: str
"""
l=len(s)
if l<2:
return s
t='*'+'*'.join(s)+'*'
p=u=0
for i in range(len(t)):
left=i-1
right=i+1
q=0
while left>=0 and right<len(t) and t[left]==t[right]:
left-=1
right+=1
q+=1
if u<q:
u=q
p=(i-q)//2
return s[p:p+u]
解决回文子串问题最好的方法是Manacher 算法,大致思路就是,在字符串首尾及各个字符之间加入同一个字符(随便),这样可以使新字符串一定是奇数个字符,然后以 i 为中心,向两边展开,确定最长的回文子串,start用来确定起始位置。max_len恰好是长度。
这道题特别容易出错的地方是,不要以为把字符串反转过来再去比较,找相同部分,就可以了,比如"abccb"这个就不行。
不过在写这种算法时,我发现reverse()函数返回的不是列表。