题目描述
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例 1:
输入: “babad”
输出: “bab”
注意: “aba” 也是一个有效答案。
示例 2:
输入: “cbbd”
输出: “bb”
解决思路1
回文字符串,就是顺序读取和逆序读取的结果是一样的,比如“上海自来水来自海上”,我们在判断回文字符串的时候,可以认为回文字符串都是有一个中心的,比如“上海自来水来自海上”的中心就是“水”,以“水”为中心,向两边拓展,每个对应的字符都是一样的,则我们认为这是一个回文字符串,这就是中心拓展思想。
但是我们应该还考虑一种情况,回文字符串长度为偶数的时候,比如“1221”,这个字符串的中心在“22”中间,依然可以用中心拓展思想来做,但是我们如何在代码里表示它的中心呢?我们在这里试着在字符串中间插入“#”字符,原来的字符串就变为“1#2#2#1”,那么这个回文字符串的中心就是“#”,对上面的字符串也进行字符中间插入“#”,那么“上#海#自#来#水#来#自#海#上”的中心依然是“水”,那么就很好的解决了字符串长度为奇数,或者偶数的问题。
我们观察上面的两个回文字符串可以发现,在转换之后的字符串中,第0,2,4,6…个字符是原来字符串中的字符,我们插入的“#”字符均在奇数位置上,那么我们就在遍历寻找中心的时候,当索引i指向偶数位置的时候,start = end = i//2,当索引i指向奇数位置的时候start = (i-1) // 2,end = (i+1)//2。具体代码如下:
#中心拓展算法
#时间复杂度O(n^2)
class Solution:
def longestPalindrome(self, s):
"""
:type s: str
:rtype: str
1#2#3#2#1
"""
str_ = ""
for i in range(2*len(s)-1):
if i%2 == 0: #索引i指向偶数位置
start = end = i//2
while start>=0 and end<len(s) and s[start]==s[end]:
start-=1
end+=1
else: #索引i指向奇数位置
start = (i-1) // 2
end = (i+1) //2
while start>=