📅  最后修改于: 2023-12-03 15:28:39.785000             🧑  作者: Mango
这是一个计算机科学门考试的模拟题,考察的是数据结构和算法方面的知识。具体的考题要求如下:
给定一个字符串 s,你需要找到其中最长的回文子串。 回文串是正反两个方向都相同的字符串。
示例1:
输入:s = "babad"
输出: "bab"
解释: "aba" 同样是符合题意的答案。
示例2:
输入:s = "cbbd" 输出:"bb"
示例3:
输入:s = "a" 输出:"a"
示例4:
输入:s = "ac" 输出:"a"
这道题可以采用中心扩展的方法来解决。中心扩展即先假设回文串的中心在字符串中的某个位置,然后同时向左右两个方向扩展,直到左右两个字符不相等或边界被达到。因为回文串的长度可能是偶数或奇数,所以需要以每个字符为中心向两个方向扩展,或以每两个相邻字符为中心向两个方向扩展。每次扩展的时候都要记录当前的最长的回文串。
下面是 python 代码示例,它实现了中心扩展的算法:
class Solution(object):
def longestPalindrome(self, s):
"""
:type s: str
:rtype: str
"""
if not s:
return '' # 空字符串
# 记录最长回文串
res = ''
# 每个字符为中心的情况
for i in range(len(s)):
# 回文串为奇数的情况,以当前字符为中心
l, r = i, i
while l >= 0 and r < len(s) and s[l] == s[r]:
l -= 1
r += 1
if len(res) < r - l - 1:
res = s[l + 1:r]
# 回文串为偶数的情况,以当前字符及下一个字符为中心
l, r = i, i + 1
while l >= 0 and r < len(s) and s[l] == s[r]:
l -= 1
r += 1
if len(res) < r - l - 1:
res = s[l + 1:r]
return res
中心扩展的算法的时间复杂度为 O(n^2),其中 n 是 s 的长度。因为需要遍历每个字符和每个相邻字符,然后同时向两个方向扩展。如果把判断回文串的方法优化成O(1),则可以达到 O(n) 的时间复杂度。