📌  相关文章
📜  教资会网络 | UGC NET CS 2016 年 8 月 – II |问题 30(1)

📅  最后修改于: 2023-12-03 14:54:50.183000             🧑  作者: Mango

教资会网络 | UGC NET CS 2016 年 8 月 – II |问题 30

简介

UGC NET CS 2016 年 8 月 – II 是一次针对计算机科学领域的全国性考试,旨在选拔高水平的计算机科学人才。本次考试问题 30 主要针对程序员的编程能力及理解能力。

问题描述

给定一个非空字符串 $s$,请编写一个函数 $solution(s)$ 来寻找 $s$ 中最长的回文子串,并返回该子串。

示例
>>> solution("babad")
"bab"
>>> solution("cbbd")
"bb"
解题思路

本题是一个经典的回文子串问题,可以使用中心扩展法来解决。具体来说,我们需要枚举所有可能的回文中心,然后不断扩大回文区间,直到无法扩大为止。具体实现可以使用两个指针分别从回文中心向左右两侧扩展,时间复杂度为 $O(n^2)$,其中 $n$ 是字符串的长度。

另外,本题还有一个比较优秀的时间复杂度为 $O(n)$ 的 Manacher 算法,不过本文不进行详细讲解。

代码实现

以下是使用 Python 语言实现的解题代码,使用中心扩展法。

def solution(s: str) -> str:
    def extend_palindrome(s: str, left: int, right: int) -> str:
        while left >= 0 and right < len(s) and s[left] == s[right]:
            left -= 1
            right += 1
        return s[left + 1:right]

    result = ""
    for i in range(len(s)):
        palindrome = extend_palindrome(s, i, i)
        if len(palindrome) > len(result):
            result = palindrome
        palindrome = extend_palindrome(s, i, i + 1)
        if len(palindrome) > len(result):
            result = palindrome
    return result

其中 extend_palindrome 函数用于寻找以某个位置为中心的最长回文子串,而主函数则枚举了所有可能的回文中心,从而得到最终结果。