题目
给你一个字符串 s,找到 s 中最长的回文子串。
如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。
示例
示例 1:
输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。
示例 2:
输入:s = "cbbd"
输出:"bb"
提示:
1 <= s.length <= 1000
s 仅由数字和英文字母组成
解题思路
回文字符串是对称的,通过实例也可以发现,不光有奇数个字符的回文,也可以是偶数型的对称,甚至一个字符。那么回文子串的可能性包括一下三种:
- 单个字符,如 a
- 偶数回文,如 abba
- 奇数回文,如 aba
那么每个回文都会有一个回文的中心,也就是对称轴。想要找最长的子串,就可以遍历字符串,寻找将某个字符或某两个字符作为回文中心时能找到的最长回文子串。
代码实现
class Solution(object):
def finding(self,s,left,right):
while right<len(s) and s[left]==s[right] and left>=0:
left-=1
right+=1
return left+1,right-1
def longestPalindrome(self, s):
"""
:type s: str
:rtype: str
"""
start, end=0,0
for i in range(len(s)):
s1,e1=self.finding(s,i,i)#以该字符为回文中心 奇数型
s2,e2=self.finding(s,i,i+1)#以该字符和下一个字符为回文中心 偶数型
if e1-s1>end-start:
start, end=s1,e1
if e2-s2>end-start:
start,end=s2,e2
return s[start:end+1]