📜  门| GATE CS Mock 2018年|套装2 |问题6(1)

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

GATE CS Mock 2018年 套装2 问题6

这是一个计算机科学门考试的模拟题,考察的是数据结构和算法方面的知识。具体的考题要求如下:

题目描述

给定一个字符串 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) 的时间复杂度。