求最大长度回文数

解法1:暴力列举所有子数,再求回文数,时间复杂度O(n^3)
解法2:遍历所有字符,查找所有基于此字符的回文数,时间复杂度O(n^2)
解法3:manacher算法,时间复杂度O(n)。参考

class Solution(object):
    def longestPalindrome(self, s):
        """
        :type s: str
        :rtype: str
        manacher算法,先使用特殊符号间隔开所有字符,所得到的回文数就肯定是基数了
        """
        l = len(s)
        if l < 2: return s

        newS = ""
        for i in s:
            newS = newS + "#" + i
        newS = "$" + newS + "#"

        newSl = len(newS)
        p = []
        p.append(1)
        mx = 0
        id = 0
        max = 0
        maxi = 0

        # 以下计算出数组对应的i位置最长回文长度P数组
        for i in range(1, newSl):
            if mx > i :
                p.append(min(p[2*id-i], mx-i))
            else:
                p.append(1)

            while i + p[i] < newSl and newS[i + p[i]] == newS[i - p[i]]:
                p[i] = p[i] + 1

            if i+p[i] > mx:
                mx = i + p[i]
                id = i

                if max < p[i]:
                    max = p[i]
                    maxi = i

        #求出最大长度的回文数

        if max < 2:
            return s[2]
        else:
            left = maxi-(max-1)
            right = maxi+max-1
            r = newS[left:right]
            r = r.replace('#', '')
            return r
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 算法思想贪心思想双指针排序快速选择堆排序桶排序荷兰国旗问题二分查找搜索BFSDFSBacktracking分治动态...
    第六象限阅读 3,351评论 0 0
  • 最长回文子串——Manacher 算法 1. 问题定义 最长回文字符串问题:给定一个字符串,求它的最长回文子串长度...
    林大鹏阅读 2,804评论 0 6
  • 转载:https://segmentfault.com/a/1190000003914228 0. 问题定义 最长...
    susu2016阅读 622评论 0 0
  • https://leetcode.windliang.cc/ 第一时间发布 题目描述(中等难度) 给定一个字符串,...
    windliang阅读 301评论 0 0
  • 阳光落满每一个清晨破碎在地砖与柏油路 它轻轻拂来 枝叶翩跹 枯黄的剑叶 零落成岁月的痕迹 旋转 旋转 落定的尘埃 ...
    洋川川阅读 143评论 2 3