题目描述

给你一个字符串 s,找到 s 中最长的回文子串。

如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。

思路

从头开始遍历然后做中心扩展,记录最长的子串即可。

需要处理奇数和偶数的情况,在遍历时分别对 s[i]s[i:i+1] 做中心扩展即可。

最终代码:

class Solution:
    def longestPalindrome(self, s: str) -> str:
        ls = len(s)
 
        def expand(l, r):
            while l >= 0 and r < ls and s[l] == s[r]:
                l -= 1
                r += 1
            return l+1, r-1
 
        start, end = 0, 0
        for i in range(len(s)-1):
            l1, r1 = expand(i, i)
            l2, r2 = expand(i, i+1)
            if r1-l1 > end-start:
                start, end = l1, r1
            if r2-l2 > end-start:
                start, end = l2, r2
        return s[start:end+1]

想得太多

expand 函数直接从 (i, i) 开始判断,这样既能处理奇数情况也能处理偶数情况。

在循环

        def expand(l, r):
            while l >= 0 and r < ls and s[l] == s[r]:
                l -= 1
                r += 1
            return l+1, r-1

中,边界条件失效时正确答案一定是 (l+1, r-1)

看起来简单,但写起来还是踩了一些坑的。