• [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种情况:

    • 1.对称点i'回文范围在里面,则i回文半径=i'回文半径,不需要扩展
    • 2.对称点i'回文范围在外面,则i回文半径=i->R(回文右边界),不需要扩展
    • 3.对称点i'回文范围压线,则i回文半径至少为i->R,从R点开始查找

    扩展

    1.给一个字符串(s),在后面添加字符,求能得到的最短回文长度。

    实际上是求必须包括最后一个字符串的情况下,最长回文子串是多长,前面的逆序添加即可。使用Manacher算法时取i+p[i]为最后一个字符时的最长回文子串。

    2.[LeetCode]516. Longest Palindromic Subsequence 最长回文子序列

    最长回文子序列和最长回文子串的区别是,子串是字符串中连续的一个序列,而子序列是字符串中保持相对位置的字符序列,例如,"bbbb"可以是字符串"bbbab"的子序列但不是子串。
    可通过最长公共子序列的解法解决,最长回文子序列 = (原串+反转串)的最长公共子序列。算法的复杂度是 时间和空间都是 (O(n^2))

    3.插入最少的字符使字符串成为回文。给定一个字符串S,可以通过在字符串的任意位置插入字符,使其变为回文串。求最少插入字符的数量。
    例如:
    ab -> bab 1
    aa -> aa 0
    abca -> acbca 1

    如果能在原串(S)中找到最长的子序列(L),这个子序列是回文,那么我们就能知道要插入多少个字符是的原串成为回文。即

    [ans = len(s) - len(L) ]

    问题转为求一个字符串的最长回文子序列。

    参考:
    【LeetCode】5. Longest Palindromic Substring

  • 相关阅读:
    java spring-mvc + maven + hibernate + mysql 注释
    c# log4net
    c# winform richtextbox 锁屏和滚屏
    socket 客户端
    c# winform插件
    c# 注册全局热键
    c# 请求api获得json数据
    java 把一个文件夹里图片复制到另一个文件夹里
    c# UpdateLayeredWindow异形窗口
    【哈希】身份证问题
  • 原文地址:https://www.cnblogs.com/hellojamest/p/11575478.html
Copyright © 2020-2023  润新知