Manarcher 求 字符串 的最长回文子串 【记录】
声明:这里仅仅写出了实现过程。想学习Manacher的能够看下这里给出的实现过程,算法涉及的一些原理推荐个博客。
给个链接
引子:给定一个字符串s,让你求出最长的回文子串的长度。
算法大致实现过程:
一:为了排除回文字符串长度奇或偶的影响。
先在每两个字符之间插入一个原字符串没有出现过的字符(这里就用#)构成新串str。设p[i] 为以str[i]字符为中心的回文字符串的最大半径。
则新串中以str[i]为中心的回文串长度为p[i]-1。
二:字符串从前到后求p[]数组。
(不要问为什么从前到后)
三:枚举全部p[i]值,更新最大值。
Manacher精华——求p[]数组。首先我们在求p[i]时,已经求出前面的p[j]值(0<=j<=i-1)
求p[i]的准备:
用mx记录 max{ k+p[ k ] } (0<=k<=i-1) ——前面全部回文字符串能覆盖到的最右边的位置。
用id记录mx取最大值时的k ——前面全部回文字符串中能覆盖到最右边位置 的那个以字符str[id]为中心的回文串。
(1)依据前面的p[]求p[i]
一,mx > i ——以str[id]为中心的回文字符串把字符str[i]覆盖到了。
这个情况下我们能够得到 :p[ i ]= min( p[2*id - i ], mx - i )。(为什么?请看我推荐的博客)
二,mx <= i ——以str[id]为中心的回文字符串以字符str[i]结尾或者没有覆盖到字符str[i]。
这样的情况下p[i] = 1。由于回文串仅仅有它自己。(为什么?请看我推荐的博客)
(2)当然上面的处理还是不够的,由于处理过后得到的p[i]并不一定是我们所想要的最优的回文串半径。
(为什么?请看我推荐的博客)
兴许处理非常好理解的。
while(str[ i + p[i] ] == str[ i - p[i] ]) p[i]++;//向左右继续延伸 直到不能延伸为止
(3)每次求出p[i]后,能够先求出计算p[i+1]要用到的id。
代码实现:
#include <cstdio>
#include <cstring>
#include <algorithm>
#define MAXN 110100
using namespace std;
char s[MAXN];//原串
int str[MAXN*2];//新串 注意数组大小
int p[MAXN*2];
void Manacher(char *T)
{
int len = strlen(T);
int l = 0;
str[l++] = '@';//防止越界
str[l++] = '#';
for(int i = 0; i < len; i++)
{
str[l++] = T[i];
str[l++] = '#';
}
str[l] = 0;
int mx = 0, id = 0;
int ans = 0;
for(int i = 0; i < l; i++)
{
if(mx > i)//2*id-i 为 i关于id的对称点
p[i] = min(p[2*id - i], mx-i);
else
p[i] = 1;
//左右延伸
while(str[i+p[i]] == str[i-p[i]]) p[i]++;
if(i + p[i] > mx)//找计算p[i+1]用到的id
{
mx = i + p[i];
id = i;
}
ans = max(p[i]-1, ans);
}
printf("%d\n", ans);
}
int main()
{
while(scanf("%s", s) != EOF)
{
Manacher(s);//求字符串s的 最长回文子串长度
}
return 0;
}
本人数据结构非常渣,有错误的地方欢迎指正。 (⊙o⊙)
Manarcher 求 字符串 的最长回文子串 【记录】的更多相关文章
- (转载)Manacher'sAlgorithm: O(n)时间求字符串的最长回文子串
以下内容转载自:传送门 源于这两篇文章: http://blog.csdn.net/ggggiqnypgjg/article/details/6645824http://zhuhongcheng.wo ...
- 【回文字符串】 最长回文子串O(N) Manacher算法
原理讲的清晰:Manacher's ALGORITHM: O(n)时间求字符串的最长回文子串 注意: ①动态生命P[]和newStr数组后,不要忘记delete[] //其实这是基本的编码习惯 ②最终 ...
- leetcode 求一个字符串的最长回文子串
最长回文子串问题:给定一个字符串,求它的最长回文子串长度.如果一个字符串正着读和反着读是一样的,那它就是回文串. 给定一个字符串,求它最长的回文子串长度,例如输入字符串'35534321',它的最 ...
- 计算字符串的最长回文子串 :Manacher算法介绍
转自: http://www.open-open.com/lib/view/open1419150233417.html Manacher算法 在介绍算法之前,首先介绍一下什么是回文串,所谓回文串,简 ...
- LeetCode之“字符串”:最长回文子串
题目要求: 给出一个字符串(假设长度最长为1000),求出它的最长回文子串,你可以假定只有一个满足条件的最长回文串.例如,给出字符串 "abcdzdcab",它的最长回文子串为 & ...
- leetcode.字符串.5最长回文子串-Java
1. 具体题目 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: "babad" 输出: "bab" ...
- 字符串的最长回文串:Manacher’s Algorithm
题目链接:Longest Palindromic Substring 1. 问题描述 Given a string S, find the longest palindromic substring ...
- LeetCode:Longest Palindromic Substring 最长回文子串
题目链接 Given a string S, find the longest palindromic substring in S. You may assume that the maximum ...
- 转载:LeetCode:5Longest Palindromic Substring 最长回文子串
本文转自:http://www.cnblogs.com/TenosDoIt/p/3675788.html 题目链接 Given a string S, find the longest palindr ...
随机推荐
- 【POJ 3090】 Visible Lattice Points
[题目链接] http://poj.org/problem?id=3090 [算法] 通过观察发现,在这个平面直角坐标系中,除了(1,1),(1,0)和(0,1),所有可见点的横纵坐标互质 那么,问题 ...
- Spring进行表单验证
转自:https://www.tianmaying.com/tutorial/spring-form-validation 开发环境 IDE+Java环境(JDK 1.7或以上版本) Maven 3. ...
- [Java] Oracle的JDBC驱动的版本说明
classes12.jar,ojdbc14.jar,ojdbc5.jar和ojdbc6.jar的区别,之间的差异 作者:赵磊 博客:http://elf8848.iteye.com 来源:http:/ ...
- H3BPM子表的复制
在做一个流程的时候,碰到了下面的表数据直接从上表中获取,并且为不可编辑状态,没有增加和删除行的按钮.一开始使用的是ComputationRule属性,但是有一项是日期空间,没有这个属性,不知道怎么处理 ...
- vim下的autocmd
AUTOCMD *autocmd.txt* For Vim version 6.2. 最后修改: 2003年3月28日 VIM 参考手册 作者:Bram Moolenaar 翻译:Zimin<c ...
- .NET微服务架构及API网关
一.MSA简介 1.1.MSA是什么 微服务架构MSA是Microservice Architecture的简称,它是一种架构模式,它提倡将单一应用程序划分成一组小的服务,服务之间互相通讯.互相配合, ...
- linux下使用bcp备份sybase数据
命令|数据库名|表名|导出到|文件名|格式|sybase服务名|数据库登录名 |字符集 bcp dbname..tablename out filename -n -Sgfdmhk -UISISMan ...
- 6) 十分钟学会android--Activity的生命周期之启动与销毁
当用户导航.退出和返回您的应用时,应用中的 Activity 实例将在其生命周期中转换不同状态. 例如,当您的Activity初次开始时,它将出现在系统前台并接收用户焦点. 在这个过程中,Androi ...
- 2019苏州凯美瑞德Java开发面试
第四家Kmerit,苏州园区,出门晚了差点迟到,一点五十五到达,先花了一小时笔试,后来两个人技术面试,四点二十出了大楼. 一.笔试 1.单选,知识点很散,涉及数据结构链表,数组,树,堆,数据库,网络, ...
- VTK资料收集
使用Qt Creator开发VTK 原文链接:http://blog.csdn.net/numit/article/details/10200507 VTK应用系列:非常强大!非常善良 05-VTK在 ...