给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例 1:
输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。
示例 2:
输入: "cbbd"
输出: "bb"
思路
基于中心朝两边扩散的思路,即遍历每一个点朝两边扩散,判断朝两边扩散的最大值即为此点的最大回文长度
例如:
收到:ababb
将其变成 #a#b#a#b#b#
这样做的目的是可以保证每一个点都可以成为中心点,可以朝两边扩散,不用判断回文长度是单数还是双数分开求解。
例如上面有子回文’aba‘和‘bb’分别由点’b‘为中心点扩散(#a#b#a#)和‘#’为中心点扩散(#b#b#)
for循环遍历每一个点的index为i,设一个步长为strip(最开始设为1),我们首先要看的是中心点两边的数是否为回文,如果是就让strip+1,因为找的是最大的回文长度,所以不用在意更小的回文。
py代码:
class Solution:
def longestPalindrome(self, s: str) -> str:
if len(s) <= 1:
return s
answer = ""
new_s = "#"
for i in s:
new_s +=i + "#"
strip = 1
for i in range(1,len(new_s)-2):
while i - strip >= 0 and i + strip < len(new_s) and new_s[i-strip:i+strip+1] == new_s[i-strip:i+strip+1][::-1]:
answer = new_s[i-strip:i+strip+1]
strip+=1
a = ""
for i in answer:
if i != '#':
a+=i
return
最快PY:
class Solution:
def longestPalindrome(self, s: str) -> str:
n = len(s)
if n < 2 or s == s[::-1]:
return s
max_len = 1
start = 0
for i in range(1,n):
even = s[i-max_len:i+1]
odd = s[i-max_len-1:i+1]
if i-max_len-1>=0 and odd == odd[::-1]:
start = i-max_len-1
max_len += 2
continue
if i-max_len>=0 and even == even[::-1]:
start = i-max_len
max_len += 1
return s[start:start+max_len]