zoukankan      html  css  js  c++  java
  • 5. 最长回文子串

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

    示例 1:

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

    输入: "cbbd"
    输出: "bb"

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/longest-palindromic-substring
    思路:manacher算法模板题

    manacher算法是对朴素的回文串搜索的优化,只需要O(n)的时间复杂度就可以计算最长回文串。

    代码:

    class Solution:
        def longestPalindrome(self, s: str) -> str:
            if s=="":
                return ""
            index=[0,1]
            mid=1
            r=1
            a=['#']
            for i in s:
                a.append(i)
                a.append('#')
            l=len(a)
            ll=0
            for i in range(2,l):
                if i<mid+r:
                    ll=min(index[2*mid-i],mid+r-i)
                else:
                    ll=0
                if i+ll>=mid+r:
                    j=1
                    while i+ll+j<l and i-ll-j>=0 and a[i+ll+j]==a[i-ll-j]:
                        j+=1
                    ll=ll+j-1
                    if i+ll>mid+r:
                        mid=i
                        r=ll
                index.append(ll)
            ans=""
            num=max(index)
            mnum=0
            for i in range(len(index)):
                if index[i]==num:
                    mnum=i
                    break
            start=0
            if num%2==0:
                start=int((mnum)/2-num/2)
            else:
                start=int((mnum+1)/2-(num-1)/2)-1
            for i in range(start,start+num):
                ans+=s[i]
            return ans
  • 相关阅读:
    JDK1.8源码阅读系列之四:HashMap (原创)
    二叉搜索树Java实现(查找、插入、删除、遍历)
    MySQL索引的索引长度问题
    JDK1.8源码阅读系列之三:Vector
    JDK1.8源码阅读系列之二:LinkedList
    JDK1.8源码阅读系列之一:ArrayList
    Java synchronized关键字用法(清晰易懂)
    两栏布局,左边定宽,右边自适应
    css使子元素在父元素居中的各种方法
    基于Vue2、WebSocket的仿腾讯QQ
  • 原文地址:https://www.cnblogs.com/big-zoo/p/13587794.html
Copyright © 2011-2022 走看看