[算法] Manacher算法线性复杂度内求解最长回文子串
参考:http://www.felix021.com/blog/read.php?2040
以上参考的原文写得很好,解析的非常清楚。以下用我自己的理解,对关键部分算法进行简单的描述:
- 回文的判断需要完成从中心字符向两侧进行逐字符匹配;
- 回文好比圆,由两个重要的参数决定,即“圆心”(中心字符,对偶数长的回文而言是两个字符)和“直径”(回文长度);
- 如果一个“点”落入另一个“圆”内,则以这个点为圆心的“圆”必定受这个“大圆”及相对大圆圆心对称的“对称圆”的影响:
- 在“大圆”范围内,这个“圆”的直径不能大于“对称圆”的直径(只要在大回文的范围内,该回文的字符匹配结果可以取用对称位置回文的匹配结果);
- 即使“对称圆”超出“大圆”边界,这个“圆”也不能超出“大圆”边界(如果对称位置回文长度超出了大回文范围,则该回文不可超出范围,否则大回文需要延展,即大圆需要扩张);
盗两张图:

对称回文在大回文范围内

对称回文超出大回文范围
这个算法巧妙利用了回文的特点,在线性求解过程中充分利用了之前已得到的结果,尽量避免重复匹配,极大降低复杂度。
string = "12212321"
SEPCHAR = '#' target = "" # pre-process for i in range(len(string)):
target = target + SEPCHAR + string[i] target=target + SEPCHAR # the key procedure idx = 0
mx = 0
p=[] for i in range(len(target)):
p.append(0) for i in range(len(target)):
if i >= mx:
p[i] = 1
else:
p[i] = min(p[2*idx-i], mx-i)
while (i+p[i]) in range(len(target)) and (i-p[i]) in range(len(target)) and target[i+p[i]] == target[i-p[i]]:
p[i] += 1
if (i + p[i] > mx):
mx = i + p[i]
idx = i # print the results print string for i in range(len(target)):
print target[i], print "" max_len = 0
center = 0 for i in range(len(target)):
print p[i],
if p[i] > max_len:
max_len = p[i]
center = i print "" print "max len of palindrom is %d at index %d" %(max_len-1, center/2)
[算法] Manacher算法线性复杂度内求解最长回文子串的更多相关文章
- HiHo 1032 最长回文子串 (Manacher算法求解)
/** * 求解最长回文字串,Manacher算法o(n)求解最长回文子串问题 **/ #include<cstdio> #include<cstdlib> #include& ...
- hihocoder #1032 : 最长回文子串 Manacher算法
题目链接: https://hihocoder.com/problemset/problem/1032?sid=868170 最长回文子串 时间限制:1000ms内存限制:64MB 问题描述 小Hi和 ...
- 最长回文子串问题-Manacher算法
转:http://blog.csdn.net/dyx404514/article/details/42061017 Manacher算法 算法总结第三弹 manacher算法,前面讲了两个字符串相算法 ...
- 最长回文子串——manacher
最长回文子串--Manacher 算法 (原版的博主的代码都是用py写的,这里改成c++) c++ 算法 字符串处理 0. 问题定义 最长回文子串问题:给定一个字符串,求它的最长回文子串长度. 如果一 ...
- 【hiho一下】第一周 最长回文子串
题目1:最长回文子串 题目原文:http://hihocoder.com/contest/hiho1/problem/1 [题目解读] 题目与 POJ 3974 palindrome 基本同样.求解最 ...
- leetcode-5 最长回文子串(动态规划)
题目要求: * 给定字符串,求解最长回文子串 * 字符串最长为1000 * 存在独一无二的最长回文字符串 求解思路: * 回文字符串的子串也是回文,比如P[i,j](表示以i开始以j结束的子串)是回文 ...
- 求最长回文子串,O(n)复杂度
最长回文子串问题-Manacher算法 最长回文串问题是一个经典的算法题. 0. 问题定义 最长回文子串问题:给定一个字符串,求它的最长回文子串长度. 假设一个字符串正着读和反着读是一样的,那它就是回 ...
- hiho一下 第一周 最长回文子串
时间限制:1000ms 单点时限:1000ms 内存限制:64MB 描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在编程的学习道路上一同前进. 这 ...
- Manacher算法:求解最长回文字符串,时间复杂度为O(N)
原文转载自:http://blog.csdn.net/yzl_rex/article/details/7908259 回文串定义:"回文串"是一个正读和反读都一样的字符串,比如&q ...
随机推荐
- RSA密钥——JAVA与C#的区别和联系
PS:好久没写博了,最近在考虑以后的事情,而且手上杂事也比较多,终于得空来写两篇. 首先感谢:http://www.codeproject.com/Articles/25487/Cryptogra ...
- Mysql –>EF edmx(model first)–> Sql server table
一.mysql environment When we create an new database,first We need draw er diagram for somebody to sho ...
- ActiveReports 9 新功能:创新的报表分层设计理念
在最新发布的ActiveReports 9报表控件中添加了多项新功能,以帮助你在更短的时间里创建外观绚丽.功能强大的报表系统,本文将重点介绍创新的报表分层设计理念,对报表内容进行分组管理与设计,易于实 ...
- activiti 工作流
1. 工作流的概念 工作流(Workflow),就是“业务过程的部分或整体在计算机应用环境下的自动化”,它主要解决的是“使在多个参与者之间按照某种预定义的规则传递文档.信息或任务的过程自动进行,从而实 ...
- CodeBlocks VS2015编译环境设置
1. 菜单 Settings --> Compiler... 2. 设置vs 的安装路径
- Tomcat服务器与MyEclipse绑定
myeclipse中eclipse添加了很多非常实用的插件,几乎包含了常用的所有应用服务器插件,其中自然包括支持各个版本的Tomcat插件. 先来看看Tomcat处理浏览器请求的过程图: 1.Tomc ...
- sessionId在fragment里无法保存的问题
fragment页面需要验证用户是否登录.若没登陆调用登录页面,后返回fragment. 这个问题解决 sessionId = SharePreferenceUtils.getSessionId(); ...
- Android笔记——Windows环境下Android Studio v1.0安装教程
本文主要讲解Windows环境下Android Studio的安装教程,Mac的Android Studio安装与此类似不在赘述,另外友情提示Windows下的SDK与Mac的SDK是通用的,可以直接 ...
- winform(数据导出、TreeView的使用)
一.数据导出:目标: 将数据库的数据导出成Excel工作表或是Word文档 基本步骤: 1.首先将数据库中的数据封装成实体类 2.写好查询数据的方法,在主窗体中调用查看所有的数据 3.利用saveFi ...
- Vue基础理论
一 vue的定位 (1)Vue.js是一个构建数据驱动的 web 界面的库. (2)Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件. (3)Vue.js 自身不是一 ...