📜  门| Gate IT 2008 |问题25(1)

📅  最后修改于: 2023-12-03 15:12:39.309000             🧑  作者: Mango

题目25: 找出字符串中最长的回文子串

题目描述

给定一个字符串,找出其中最长的回文子串。

回文是指正着读和反着读都一样的字符串。

示例
输入: "babad"
输出: "bab"
注: "aba" 也是一个有效答案。
输入: "cbbd"
输出: "bb"
分析

一个字符串的所有子串可以用两个指针来表示,一个指向第一个字符,一个指向最后一个字符。

对于每一个子串,判断其是否为回文子串,即判断其左右两端的字符是否相同。如果是,则继续向中间判断;如果不是,则跳过该子串。

为了节省时间,可以在比较左右两端的字符之前,可先判断该子串的长度是否已经小于目前已知的最长回文子串的长度,如果是,则跳过该子串。

另外,由于回文字符串长度有奇偶数之分,需要分别以每个字符为中心向两侧扩散,判断最长的回文子串。

代码实现
def longestPalindrome(s: str) -> str:
    res = ""
    for i in range(len(s)):
        # 以每个字符为中心向两侧扩散,得到最长回文子串
        start, end = i, i
        while start >= 0 and end < len(s) and s[start] == s[end]:
            start -= 1
            end += 1
        if len(res) < end - start - 1:
            res = s[start+1:end]
        # 对于长度为偶数的回文子串,中心为两个相邻的字符
        start, end = i, i+1
        while start >= 0 and end < len(s) and s[start] == s[end]:
            start -= 1
            end += 1
        if len(res) < end - start - 1:
            res = s[start+1:end]
    return res
复杂度分析

由于需要枚举每个子串以及每个中心点,时间复杂度为 $O(n^2)$。

空间复杂度为 $O(1)$,只用了常数大小的额外空间存储结果。