zoukankan      html  css  js  c++  java
  • 最长回文字串

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

    示例 1:

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

    示例 2:

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

    简单易于理解的解法
     1 class Solution(object):
     2     def longestPalindrome(self, s):
     3         """
     4         :type s: str
     5         :rtype: str
     6         """
     7         n = len(s)
     8         maxL, maxR, max = 0, 0, 0
     9         for i in range(n):
    10             # 长度为偶数的回文字符串
    11             start = i
    12             end = i + 1
    13             while start >= 0 and end < n:
    14                 if s[start] == s[end]:
    15                     if end - start + 1 > max:
    16                         max = end - start + 1
    17                         maxL = start
    18                         maxR = end
    19                     start -= 1
    20                     end += 1
    21                 else:
    22                     break
    23 
    24             # 长度为奇数的回文子串
    25             start = i - 1
    26             end = i + 1
    27             while start >= 0 and end < n:
    28                 if s[start] == s[end]:
    29                     if end - start + 1 > max:
    30                         max = end - start + 1
    31                         maxL = start
    32                         maxR = end
    33                     start -= 1
    34                     end += 1
    35                 else:
    36                     break
    37         return s[maxL:maxR + 1]
    38 
    39 s='abcba'
    40 str=Solution.longestPalindrome(1,s)
    41 print(str)

    查看资料找到了manacher算法 

        这个算法是以每一个字符为中心, 向两边发散,同时,用一个数组p来记录以每一个字符为中心的回文串的一半的长度.

         先看一下该算法的核心.

         确定以第i个字符为中心的回文串长度,建立在p[1:i-1]这个数组基础上

         假设, mx为当前字符串中已经确定的回文串的最有端. po为以mx为右端的回文串的中心,

         这时候,我们需要确定 第i个字符的位置是 > ma 还是 i <= mx

         如果 i <= mx 就是当前要确定的字符包含在前面的某个回文串里面, 回文串是对称的, 所以找到i 相对于po的对称位置 j, 

         接下来, 我们要做的就是判断, ①p[j] >= mx - i  or ②p[j] < mx - i

          在第一种情况, 就是说以i为中心的回文串还有向 mx右边伸展的可能, 然而那一部分还是未知数, 就的一步一步的去求解, 第二种情况, 就是 p[j] <= mx - i, 根据回文串的堆成性质, 可以确定

          p[i] = p[j]

         当i > mx的时候也是需要我们去一步一步的求解

         我在实现的时候只是给出最长回文串的一个, 

     1 class Solution:
     2     def longestPalindrome(self, s):
     3         """
     4         :type s: str
     5         :rtype: str
     6         """
     7         s1 = '#' + '#'.join(s) + '#'
     8         length = len(s1)
     9         p = [0] * length
    10         i = 0
    11         id, mx = 0, 0
    12         while i < length:
    13             if mx > i:
    14                 p[i] = min(mx - i, p[2 * id - i])
    15             else:
    16                 p[i] = 1
    17             while (i - p[i] >= 0) and (i + p[i] < length) and (s1[i - p[i]] == s1[i + p[i]]):
    18                 p[i] += 1
    19             if (i - 1 + p[i]) > mx:
    20                 mx = i - 1 + p[i]
    21                 id = i
    22             i += 1
    23         max_length = max(p)
    24         index_id = p.index(max_length)
    25         s = s1[index_id + 1 - max_length:index_id + max_length]
    26         s2 = ''
    27         for i in s.split('#'):
    28             s2 += i
    29         return s2
    30 s='aa'
    31 str=Solution.longestPalindrome(1,s)
    32 print(str)

    第二种方法还不太明白,为什么要加‘#’号

  • 相关阅读:
    [原][诗]送幼儿园杨老师
    [原]由智能音箱被黑联想到。。。人类灭亡
    [转]VS中的路径宏 OutDir、ProjectDir、SolutionDir各种路径含义
    [原]globalmapper设置高程配色(globalmapper自定义配色方案)
    [原]JSON 字符串(值)做判断,比较 “string ”
    [转]使用 curl 发送 POST 请求的几种方式
    [转]c++多线程编程之pthread线程深入理解
    [转]c++ pthread 多线程简介
    Linux下ps -ef和ps aux的区别
    Java三种方式实现栈和队列
  • 原文地址:https://www.cnblogs.com/zhibei/p/9280804.html
Copyright © 2011-2022 走看看