其他分享
首页 > 其他分享> > [Leetcode]5.Longest Palindromic Substring

[Leetcode]5.Longest Palindromic Substring

作者:互联网

这段时间重新刷了一下Leetcode,在此记录下自己容易出错的和经典的题目。
这是Leetcode第5题,寻找最长回文子序列,就是给定一个字符串S,找出其中的最长回文子串,并返回该子串。常用的方法有中心扩展法与Manacher算法,其中Manacher算法时间复杂度可以达到\(O(N)\), 空间复杂度\(O(N)\),需要重点掌握。
下面是Python的coding代码:

class Solution:
    def longestPalindrome(self, s):
        if not s:
            return ''
        t = '#'+'#'.join(list(s))+'#'
        p = [0 for i in range(len(t))]      
        mx = id = resLen = resCenter = 0
        for i in range(1,len(t)):
            if mx > i:
                p[i] = min(p[2 * id - i], mx - i)
            else:
                p[i] = 1
            while p[i]<=min(i,len(t)-1-i) and t[i + p[i]] == t[i - p[i]]:
                p[i]+=1
            if mx < i + p[i]:
                mx = i+p[i]
                id = i
            if resLen < p[i]:
                resLen = p[i]
                resCenter = i 
#         return resLen-1  #长度
        return s[(resCenter - resLen) // 2+1: (resCenter + resLen) // 2]

其中, mx:最大回文串的右边界。 id:为最大回文串的中心点。
这个算法有三个概念,1.回文半径数组;2.回文右边界;3.回文右边界中心(取得右边界的中心,最早出现的) 。
在i遍历的过程中有三种情况:
第一种情况,当前位置没有在回文右边界里面,则暴力扩展
第二种情况,当前位置在回文右边界里面,找位置i关于右边界中心的对称点i',分3种情况:

参考:
【LeetCode】5. Longest Palindromic Substring

标签:边界,Palindromic,对称点,mx,Substring,半径,Leetcode,回文
来源: https://www.cnblogs.com/hellojamest/p/11575478.html