算法-最长回文子串

zjk 发布于 2024-02-05 132 次阅读


题目

力扣题目:https://leetcode.cn/problems/longest-palindromic-substring/description/

给你一个字符串 s,找到 s 中最长的回文子串。
如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。

示例 1:

输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。

示例 2:

输入:s = "cbbd"
输出:"bb"

提示:

  • 1 <= s.length <= 1000
  • s 仅由数字和英文字母组成

题解

要考虑两种情况:奇数长度的回文串和偶数长度的回文串。

首先,将最长回文子串 res 设为空字符串。

然后,遍历整个字符串,使用指针 i。在每个位置向前寻找回文子串,但我们只需要找到长度大于 res 的回文子串,所以我们定位回文子串的开始位置为 start = max(0, i - len(res) - 1),结束位置为i

最后,根据选定的回文子串的索引范围对字符串进行切片,并判断是否为回文子串。这里需要注意,我们要考虑奇数长度和偶数长度的情况,如果找到更长的回文子串,就将其赋值给 res。随着指针的遍历,res 的长度会逐渐增大,最终遍历结束后,res 就是最长的回文子串。

def longestPalindrome(s):
    res = ''
    for i in range(len(s)):
        start = max(i - len(res) - 1, 0)
        temp = s[start:i + 1]
        if temp == temp[::-1]:
            res = temp
        elif temp[1:] == temp[1:][::-1]:
            res = temp[1:]
    return res


if __name__ == '__main__':
    print(longestPalindrome('abcdeedcssw'))