for i inrange(len(s)): len1 = expand_around_center(s, i, i) # 奇数长度,此时左右指针都从中间开始 len2 = expand_around_center(s, i, i + 1) # 偶数长度,从中间以及中间右边开始 max_len = max(len1, len2) if max_len > end - start: # max_len表示本次的最长长度,end-start表示历史最长,节省了一个变量, start = i - (max_len - 1) // 2# 中间减去一半 end = i + max_len // 2
return s[start:end + 1]
defexpand_around_center(s: str, left: int, right: int) -> int: # 找到给定中心的最长回文子串 while left >= 0and right < len(s) and s[left] == s[right]: left -= 1 right += 1 return right - left - 1
longest_palindrome('ababcb')
为什么不用判断i+1超范围:expand_around_center(s, i, i + 1)该函数内部会自动处理
为什么right - left - 1不也是right - left +1:循环退出时,left 和 right 已经扩展到不能继续为回文了,也就是指向非回文串第一个元素的前一个元素和最后元素的后一个元素,此时的 s[left+1 : right] 才是最后一个合法的回文子串