求字符串的最长回文子串--最直观的“马拉车算法”分析
来源:互联网 发布:无锡关键词优化 编辑:程序博客网 时间:2024/06/03 21:10
本文转载自:求字符串的最长回文子串--最直观的“马拉车算法”分析
首先用一个非常巧妙的方式,将所有可能的奇数/偶数长度的回文子串都转换成了奇数长度:在每个字符的两边都插入一个特殊的符号。比如 abba 变成 #a#b#b#a#, aba变成 #a#b#a#。 为了进一步减少编码的复杂度,可以在字符串的开始加入另一个特殊字符,这样就不用特殊处理越界问题,比如$#a#b#a#(注意,下面的代码是用C语言写就,由于C语言规范还要求字符串末尾有一个’\0’所以正好OK,但其他语言可能会导致越界)。
下面以字符串12212321为例,经过上一步,变成了 S[] = “$#1#2#2#1#2#3#2#1#”;
然后用一个数组p[i] 来记录以字符S[i]为中心的最长回文子串向左/右扩张的长度(包括S[i],也就是把该回文串“对折”以后的长度),比如S和P的对应关系:
S # 1 # 2 # 2 # 1 # 2 # 3 # 2 # 1 #
P 0 1 0 1 4 1 0 3 0 1 0 5 0 1 0 1 0
p[i]的含义如下图所示:
那么怎么计算P[i]呢?
设变量center表示最大回文子串中心的位置,right是最大回文子串的边界,j是i关于center的对称点。
计算p[i]的方法如图所示:
注意:
在上图中,当 p[j]>=right - i 时,以s[i]为中心的回文子串其向右至少会扩张到right的位置,也就是说P[i]>=right - i,所以先设置p[i]=right-i;至于right位置之后的部分是否对称,就只能老老实实去匹配了!!!
下面是我做leetcode上的题目最长回文子串Palindromic-Substring的源代码:
参考博客:
http://www.felix021.com/blog/read.php?2040
http://blog.csdn.net/hustcqb/article/details/12253635
- 求字符串的最长回文子串--最直观的“马拉车算法”分析
- Manacher马拉车算法求最长回文子串
- 最长回文子串-----“马拉车”算法
- mannachar(马拉车)求最长回文子串
- HDU 3068 manachar(马拉车)算法 求最长回文子串
- Manacher算法求字符串的最长回文子串
- hihoCoder 最长回文子串(manacher算法:马拉车)
- 最长回文字符串(马拉车算法)
- 求字符串的最长回文子串
- 求字符串的最长回文子串
- 求最大回文子串(马拉车算法)
- 最长回文子串(马拉车)
- hiho#1032 : 最长回文子串 (manacher算法O(n)时间求字符串的最长回文子串 )
- 最长回文 --马拉车算法
- 最长回文字符串算法-Manacher’s Algorithm-马拉车算法
- POJ3974 求字符串的最长回文子串的长度
- 求一个字符串的最长子回文串
- O(n)时间求字符串的最长回文子串
- 生成式文本摘要分析实践
- c++中回调函数封装成抽象类
- Android Studio Cannot Load Settings from file 错误
- spring 定时任务的 执行时间设置规则【老记不住】
- 内部排序算法的 JAVA 实现
- 求字符串的最长回文子串--最直观的“马拉车算法”分析
- 使用Django REST Framework来快速实现API调用服务——下篇(编写API服务)
- HDU
- JavaScript HTML DOM
- select函数使用
- 统计 CPU 内存 硬盘 使用率的shell脚本
- 浅谈大数据建模
- 读取数据库信息,使用QR码API批量生成二维码并下载到本地
- 在主方法中实现不同数据类型到字符串的转换