栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

leetcode 5. 最长回文子串 -中心扩展算法

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

leetcode 5. 最长回文子串 -中心扩展算法

给你一个字符串 s,找到 s 中最长的回文子串。

示例 1:

输入:s = “babad”
输出:“bab”
解释:“aba” 同样是符合题意的答案。
示例 2:

输入:s = “cbbd”
输出:“bb”
示例 3:

输入:s = “a”
输出:“a”
示例 4:

输入:s = “ac”
输出:“a”

提示:

1 <= s.length <= 1000
s 仅由数字和英文字母(大写和/或小写)组成

class Solution:
    def longestPalindrome(self, s: str) -> str:
        start = 0
        end = 0
        def expend_center(i, j ,s):
            while i >= 0 and j < len(s) and s[i] == s[j]:
                i -= 1
                j += 1
            return i + 1, j - 1
        for i in range(len(s)):
            left1, right1 = expend_center(i, i, s)
            left2, right2 = expend_center(i, i + 1, s)
            if right1 - left1 > end - start:
                start, end = left1, right1
            if right2 - left2 > end - start:
                start, end = left2, right2
        return s[start:end + 1]     

举例:aba
从a开始向两边扩展,因为触发左边界跳出
继续从a,b开始从两边扩展,因为a,b不相同则直接退出

从b开始向两边扩展,s[0]与s[1]都是a相同,则说明现在的最长长度是3
从b,a向两边扩展,右侧触边,则退出

从s[2],a开始像两边扩展,右侧触边,则退出。

边界情况即为子串长度为 1或 2的情况。我们枚举每一种边界情况,并从对应的子串开始不断地向两边扩展。如果两边的字母相同,我们就可以继续扩展,例如从 P(i+1,j-1)P(i+1,j−1) 扩展到 P(i,j)P(i,j);如果两边的字母不同,我们就可以停止扩展,因为在这之后的子串都不能是回文串了。

聪明的读者此时应该可以发现,「边界情况」对应的子串实际上就是我们「扩展」出的回文串的「回文中心」。方法二的本质即为:我们枚举所有的「回文中心」并尝试「扩展」,直到无法扩展为止,此时的回文串长度即为此「回文中心」下的最长回文串长度。我们对所有的长度求出最大值,即可得到最终的答案。

空间复杂度为o(1),因为使用的是常量的变量,时间复杂度为o(n^2),因为从中间往两边的中心点可能是1个,也可能是两个,一共有n,n-1中可能,每一种像外扩展o(n)。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/268408.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号