LeetCode | No.5 最长回文子串

相关链接

LeetCode | No.1 两数之和

LeetCode | No.2 两数相加

LeetCode | No.3 无重复字符的最长子串

LeetCode | No.4 寻找两个有序数组的中位数

题目描述

给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。

示例1:
输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。


示例2:
输入: "cbbd"
输出: "bb"

题目解析

看到这个题目,就想到第三题找最长无重复子串,但是有很大区别,相同之处就是关于子串。那么第一印象就是去暴力破解,遍历字符串,取出子串,判断其逆置后是否与其相同,也就是判断是否符合回文。从中寻找最长的一个,下面就是该方法的具体过程。

class Solution:
    def longestPalindrome(self, s: str) -> str:
        string = ""
        lenth = -1
        for i in range(len(s)):
            for j in range(i, len(s)):
                a = s[i:j+1]
                if a == a[::-1] and len(a) > lenth:
                    string = a
                    lenth = len(a)
        return string

其中,a[::-1] 运用了列表的切片,-1使其逆序排列。执行测试数据时通过了,但是在提交的时候出了问题,原因是超时,因为这个方法是暴力破解,超时的测试数据是 “一千个一” ,这就不意外了,两层的循环到最后一次才能到测试数据,超时是肯定的。参考了一下题解,提到了中心扩展算法,实现了一下,程序如下。

class Solution:
    def longestPalindrome(self, s: str) -> str:
        if s == s[::-1]:
            return s
        res = s[:1]
        for i in range(len(s)):
            len1 = self.extention(s, i, i)
            len2 = self.extention(s, i, i+1)
            res = max(len1, len2, res, key=len)
        return res
    
    def extention(self, s, left, right):
        while left >= 0 and right < len(s) and s[left] == s[right]:
            left -= 1
            right += 1
        return s[left+1:right]

LeetCode | No.5 最长回文子串_第1张图片

解释一下以上程序,中心扩展算法需要考虑 2N+1 个中心,分别为回文子串长度为奇数时,中心值为中间一个字符,有 N 种情况,回文子串长度为偶数时,中心值为中间两个字符,两个字符为中心有 N-1 种情况。因此,循环遍历这些情况,再建立一个从中间扩展两侧字符的函数,当两侧字符一致时,向外扩展一层。接下来,就需要你去品程序了,你细细的品。

扫描二维码

获取更多精彩

小田学Python

       

       

你可能感兴趣的:(LeetCode | No.5 最长回文子串)