1 问题描述
找到一个字符串中最长的回文子串。回文的含义是对称的。
2 代码实现
2.1 中心扩散法
中心扩散法的思想是,遍历整个字符串,分别以长度为1
和2
的字符字串作为中心,然后向外扩散,如果一个子串s[i: j]
是回文字符串若s[i-1]==s[j+1]
,那么s[i-1: j+1]
也是回文字符串,此处要注意,i, j
的范围应在字符串索引范围之内。
同时,对于字符串中心长度为2
的情形,需要首先判断这个子串是否是回文子串。
class Solution:
def longestPalindrome(self, s: str) -> str:
len_s = len(s)
if len_s > 1:
start = 0
end = 0
for i in range(len_s):
if i < len_s - 1:
start_ = i
end_ = i
while (start_ - 1 >= 0) & (end_ + 1 < len_s):
if(s[start_ - 1] == s[end_ + 1]):
start_ -= 1
end_ += 1
else:
break
if (end_ - start_ - end + start) > 0:
end = end_
start = start_
if i <= len_s - 2:
start_ = i
end_ = i + 1
if (s[start_] == s[end_]):
while (start_ - 1 >= 0) & (end_ + 1 < len_s):
if(s[start_ - 1] == s[end_ + 1]):
start_ -= 1
end_ += 1
else:
break
if (end_ - start_ - end + start) > 0:
end = end_
start = start_
return s[start: end+1]
else:
return s
时间复杂度 O ( n 2 ) O(n^2) O(n2),空间复杂度 O ( 1 ) O(1) O(1)。