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
  • 相关阅读:
    13.字符串压缩算法
    12.字符串全部替换指定文本
    46.数字到字符串的转换
    45.切割字符串并精确分配内存
    44.字符串删除指定字符或者字符串
    11.表达式计算对一串加减乘除带括号进行计算
    43.可变参数实现printf
    关于float与double区别
    float,double与long long哪个更大?
    double 与0比较时有个精度问题,有时需精确到小数点后面几位,例如与>0.0001,而不能与>0比较
  • 原文地址:https://www.cnblogs.com/big-zoo/p/13587794.html
Copyright © 2011-2022 走看看