📌  相关文章
📜  国际空间研究组织 | ISRO CS 2014 |问题 54(1)

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

国际空间研究组织 | ISRO CS 2014 |问题 54

这道题目要求我们在一个给定的字符串中找到最长的回文子串。回文字符串是指从左到右和从右到左读起来均一致的字符串。

思路

这道题可以使用中心扩展法来解决。中心扩展法的思想是从每个字符开始,向两边扩展来找到回文字符串。

具体实现时,我们可以使用一个循环来遍历每个字符。对每个字符,往左往右同时扩展,判断扩展出来的字符串是否是回文字符串。如果是,就更新最长回文子串的长度和起始位置。

代码
def longest_palindrome(s: str) -> str:
    n = len(s)
    if n < 2:
        return s

    max_len = 1
    start = 0

    for i in range(n):
        left, right = i, i
        while right < n - 1 and s[right] == s[right + 1]:
            right += 1
        while left > 0 and right < n - 1 and s[left - 1] == s[right + 1]:
            left -= 1
            right += 1

        if right - left + 1 > max_len:
            max_len = right - left + 1
            start = left

    return s[start:start + max_len]

这段代码中,我们首先判断字符串的长度是否小于 2,如果是直接返回字符串本身。接着我们定义了一个变量 max_len 来记录最长回文子串的长度,并且定义了一个变量 start 来记录最长回文子串的起始位置。

然后我们使用一个循环来遍历每个字符。对于每个字符,我们使用两个指针 leftright 分别指向字符串中以当前字符为中心的回文子串的左右两端。我们在循环中不断扩张这个回文子串,直到无法扩展为止。最后我们判断扩张后的回文子串的长度是否大于最长回文子串的长度,如果是则更新最长回文子串的长度和起始位置。

最后我们返回最长回文子串即可。该算法的时间复杂度是 $O(n^2)$,空间复杂度是 $O(1)$。