📅  最后修改于: 2023-12-03 14:54:50.183000             🧑  作者: Mango
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
函数用于寻找以某个位置为中心的最长回文子串,而主函数则枚举了所有可能的回文中心,从而得到最终结果。