# # 大佬博客:
https://www.cnblogs.com/z360/p/6375514.html
https://blog.csdn.net/zuanfengxiao/article/details/80341483
多个方法:https://blog.csdn.net/asd136912/article/details/78987624

自己的总结

# Manacher’s Algorithm, 复杂度o(n)
# 有两个主要的步骤:
# 将所有可能的奇数/偶数长度的回文子串都转换成了奇数长度:在每个字符的两边都插入一个特殊的符号。abba => #a#b#b#a#, aba => #a#b#a#
# 用数组 len_str[i] 来记录以字符S[i]为中心的最长回文子串向左/右扩张的长度,并增加两个辅助变量po和maxr,
# 其中 po 为已知的 {右边界最大} 的回文子串的中心,maxr则为po+len_str[po],也就是这个子串的右边界。
class Solution(object):
def longestPalindrome(self, s):
"""
:type s: str
:rtype: str
"""
# 转换字符串s,开头和结尾都添加一个特殊符号防止数组越界
s = "#" + "#".join(s) + "#"
# max_length 为转换后的字符串s中以某一个字符为中心的子回文字符串的最大长度,
max_length = 0
# maxr为当前计算回文串最右边字符的最大值(以po为中心的子回文字符串的最右边的点)
maxr = 0
# 设maxr为之前计算中最长回文子串的右端点的最大值,并且设取得这个最大值的位置为po(po为取得maxr的中心点)
po = 0
# 转换之后的s中, 以任意一个字符i为中心的子回文字符串的长度都是奇数(2*len_str(i)-1),
# 而以任意一个字符为中心的子回文字符串中, 添加的特殊符号"#"的个数为len_str(i)个, 所以剩下的原字符串中的字符个数为len_str(i)-1,
# 所以关键问题就是求len_str(i)的值, len_str(i)表示在转换之后的字符串s中以i为中心的子回文字符串的长度
len_str = [0]*len(s)
# 求len_str(i)分两种情况:
# 1. maxr > i, 假设找到i关于po的对称位置并设为j, 假设len_str(j) < maxr - i, 说明以j为中心的子回文字符串是在以po为中心的子回文字符串中包含的
# 由回文串的定义可知,一个回文串反过来还是一个回文串,所以以i为中心的回文串的长度至少和以j为中心的回文串一样,
# 即len_str[i]>=len_str[j](以i为中心的子回文字符串的长度可能比以j为中心的子回文字符串的长度大, 但至少是和j一样),
# 因为len_str[j]<maxr-i,所以说i+len_str[j]< maxr。由对称性可知len_str[i] = len_str[j], 所以当maxr>i时, 取len_str[i]的条件是
# len_str[j] < maxr -i, 即len_str[i] = min(maxr-i, len_str[2*po-i]), i和j是关于po对称的, j = 2*po-i
# 2. maxr <= i, maxr为已知的取得最长回文子串的右端点的最大值, 如果maxr<=i, 则以i为中心的子回文字符串还未匹配, 所以初始化为1(它自己),
# 匹配完成后要更新maxr的位置和对应的po以及len_str[i] # 关键点: 求以i为中心的子回文字符串的长度len_str[i]
for i in range(len(s)):
if maxr > i:
len_str[i] = min(maxr - i, len_str[2*po-i])
else:
len_str[i] = 1
# 要保证数组不能越界
while i-len_str[i] >= 0 and i+len_str[i] < len(s) and s[i-len_str[i]] == s[i+len_str[i]]:
len_str[i] += 1
# 如果匹配到更长的子回文字符串, 则进行更新
if len_str[i] + i > maxr:
maxr = len_str[i] + i
po = i
# max_length - 1即为原字符串中最长的回文子字符串的长度
max_length = max(max_length, len_str[i])
# len_str.index(max_length)即为取得最长子回文字符串的点i的位置, 而在该点取得的子回文字符串长度为2*max_length-1(为奇数),
# max_length-1表示左边和右边对称的长度(不包含中心点), 2*max_length-1 = max_length-1 + 1 + max_length-1
# 所以len_str.index(max_length) - (max_length - 1)为左端点,len_str.index(max_length) + (max_length - 1)为右端点
s = s[len_str.index(max_length) - (max_length-1):len_str.index(max_length) + (max_length-1)]
s = s.replace('#', '')
return s so = Solution()
print so.longestPalindrome("aabbccbbaa")

最长子回文字符串(Manacher’s Algorithm)的更多相关文章

  1. 最长回文字符串(manacher算法)

    偶然看见了人家的博客发现这么一个问题,研究了一下午, 才发现其中的奥妙.Stupid. 题目描述:      回文串就是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串. ...

  2. 第5题 查找字符串中的最长回文字符串---Manacher算法

    转载:https://www.felix021.com/blog/read.php?2040 首先用一个非常巧妙的方式,将所有可能的奇数/偶数长度的回文子串都转换成了奇数长度:在每个字符的两边都插入一 ...

  3. 【转载】最长回文字符串(manacher算法)

    原文转载自:http://blog.csdn.net/lsjseu/article/details/9990539 偶然看见了人家的博客发现这么一个问题,研究了一下午, 才发现其中的奥妙.Stupid ...

  4. 回文字符串 Manacher

    1. Manacher 忘光了,忘光了. 首先将字符串所有字符之间(包括头尾)插入相同分隔符,再在最前方插入另一个分隔符防止越界. 设以 \(s_i\) 为对称中心的回文串中,最长的回文半径为 \(p ...

  5. hdu3068 求一个字符串中最长回文字符串的长度 Manacher算法

    最长回文 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  6. Manacher算法:求解最长回文字符串,时间复杂度为O(N)

    原文转载自:http://blog.csdn.net/yzl_rex/article/details/7908259 回文串定义:"回文串"是一个正读和反读都一样的字符串,比如&q ...

  7. 【Manacher算法】最长子回文串

    [Manacher算法] 这个算法用来找出一个字符串中最长的回文子字符串. 如果采取暴力解最长回文子字符串问题,大概可以有两种思路:1. 遍历出所有子字符串找其中最长的回文 2. 从每个字符作为中心, ...

  8. [LeetCode] Valid Palindrome 验证回文字符串

    Given a string, determine if it is a palindrome, considering only alphanumeric characters and ignori ...

  9. leetcode 5 Longest Palindromic Substring--最长回文字符串

    问题描述 Given a string S, find the longest palindromic substring in S. You may assume that the maximum ...

随机推荐

  1. (转)pythonC3线性算法

    本文转自:http://kaiyuan.me/2016/04/27/C3_linearization/ 作者:Kaiyuan 注意:本文仅仅作为个人mark,所以排版并不如原文,另本文在原文基础上做了 ...

  2. JavaScript基本数据类型介绍

    JavaScript基本数据类型介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是javascript JavaScript一种直译式脚本语言,是一种动态类型.弱类型. ...

  3. 一致性哈希算法介绍,及java实现

    应用场景 在做服务器负载均衡时候可供选择的负载均衡的算法有很多,包括: 轮循算法(Round Robin).哈希算法(HASH).最少连接算法(Least Connection).响应速度算法(Res ...

  4. html5 canvas贝塞尔曲线篇(上)

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  5. JavaScript继承详解(五)

    在本章中,我们将分析John Resig关于JavaScript继承的一个实现 - Simple JavaScript Inheritance. John Resig作为jQuery的创始人而声名在外 ...

  6. 20155206 2016-2017-2 《Java程序设计》第7周学习总结

    20155206 2016-2017-2 <Java程序设计>第7周学习总结 教材学习内容总结 认识时间与日期 1.格林威治时间(GMT):通过观察太阳而得,因为地球公转轨道为椭圆形且速度 ...

  7. HDU 2086 A=? 数学题

    题目描述:有一个公式,Ai = (Ai-1 + Ai+1)/2 - Ci (i = 1, 2, 3, .... n).,如果给出A0, An+1, 和 C1, C2, .....Cn要你计算出A1是多 ...

  8. 洛谷 P3916 【图的遍历】反向加边+dfs

    前言: 对于这类带环的图,一般记忆化搜索不能很好的对所有遍历的边进行更新取值.因为环上的点可以相互到达,所以他们的答案因当是同步更新的,而dfs一旦你回溯完环上某个点就不会在更新这个点的答案了,做不到 ...

  9. (F - 超级英雄Hero HYSBZ - 1191 )匈牙利算法

    题目链接:https://cn.vjudge.net/contest/281037#problem/F 题目大意:中文题目 具体思路:可以看成二分图匹配,寻找最大匹配就可以了,注意当某一个匹配不到的时 ...

  10. mysql数据库的快捷键

    mysql数据库快捷键 ctrl+q 打开查询窗口 ctrl+/ 注释sql语句 ctrl+shift +/ 解除注释 ctrl+r 运行查询窗口的sql语句 ctrl+shift+r 只运行选中的s ...