以每个位置为中心,向两头扩散。分两种情况:1,以数为中心扩散,解决奇数长度的子串;2,以两数间空格为中心扩散,解决偶数长度的子串。
采用递归法判断每个位置的最长子串有多长。
class Solution:
def longestPalindrome(self, s: str) -> str:
max_len = 1
c = 0
for i in range(len(s)):
odd_n = self.judge_odd(s, i)
even_n = self.judge_even(s, i)
tmp = max(odd_n, even_n, max_len)
if tmp != max_len:
c = i
max_len = tmp
start = c - max_len // 2
return s[start:start+max_len]
def judge_odd(self, s, i, step=1):
if i - step < 0 or i + step > len(s) - 1 or s[i-step] != s[i+step]:
return (step - 1) * 2 + 1
return self.judge_odd(s, i, step + 1)
def judge_even(self, s, i, step=1):
if i - step < 0 or i + step - 1> len(s) - 1 or s[i-step] != s[i+step-1]:
return (step - 1) * 2
return self.judge_even(s, i, step + 1)
网友评论