问题概述:输入一个字符串,输出它的最长回文子串

输入样例:                             对应输出:

abbaabcba                             5

manacher算法步骤:

①处理字符串,使所有字母左右各有一个符号"#",且只有一个,第一个字符(str[0])设为"&"最后一个字符后面改'\0'

例如:abbaabcba处理后为&#a#b#b#a#a#b#c#b#a#'\0'

目的:将奇数/偶数长度的回文子串全部转换成奇数长度

②设一个数组P[i]来记录以字符Str[i]为中心的最长回文子串向左/右扩张的长度(回文字符串长度半径,最小为1),

其中P[0]=0

例如:     & # a # b # b # a # a # b # c # b # a # \0

对应P[i]:0 1 2 1 2 5 2 1 2 5 2 1 2 1 6 1 2 1 2 1

③再增加两个辅助变量id和mx,其中id表示最大回文子串中心的位置,mx则为id+P[id]也就是最大回文子串的边界

④从第一个字符("#")开始循环,用while(str[i+p[i]]==str[i-p[i]])   p[i]++判断以i为中心回文半径,

当然如果mx>i,那么P[i]一定>=min(P[2*id-i], mx-i),直接初始化P[i]=min(P[2*id-i], mx-i)再循环以省时间

原理:http://blog.csdn.net/ggggiqnypgjg/article/details/6645824/

复杂度:O(n)

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int p[200010];
char s[100010], str[200010];
int main(void)
{int n, i, k, ans, mx, id;while(scanf("%s", s)!=EOF){n = strlen(s);memset(str, '\0', sizeof(str));str[0] = '$';str[1] = '#';for(i=0;i<=n-1;i++)    /*步骤1*/{k = (i+1)*2;str[k] = s[i];str[k+1] = '#';}n = k+1;str[n+1] = 0;mx = ans = 0;for(i=1;i<=n;i++){p[i] = 1;if(mx>i)p[i] = min(p[2*id-i], mx-i+1);while(str[i+p[i]]==str[i-p[i]])p[i]++;if(p[i]+i-1>mx){mx = p[i]+i-1;id = i;}ans = max(ans, p[i]);}printf("%d\n", ans-1);}return 0;
}

manacher算法--最长回文子串相关推荐

  1. Manacher 求最长回文子串算法

    Manacher算法,是由一个叫Manacher的人在1975年发明的,可以在$O(n)$的时间复杂度里求出一个字符串中的最长回文子串. 例如这两个回文串"level"." ...

  2. 中心扩散算法--最长回文子串

    这篇看一下中心扩散算法. 输入: "babad" 输出: "bab" 注意: "aba" 也是一个有效答案. 示例 2:输入: " ...

  3. 常考数据结构与算法:最长回文子串

    暴力解法: 列举所有的子串,判断是否为回文串,保存最长的回文串. /** 暴力解法: 列举所有的子串,判断是否为回文串,保存最长的回文串.*/public int getLongestPalindro ...

  4. 怎么判断一个字符串的最长回文子串是否在头尾_回文自动机入门

    缘起 回文自动机(Palindrome auto machine PAM,有些地方称之为回文树)是回文问题的大杀器~  本文使用一道很简单的题目入门这个精巧的数据结构. hdu 2163 Palind ...

  5. Manacher's algorithms(马拉车算法)最长回文子串

    最长回文子串 https://leetcode-cn.com/problems/longest-palindromic-substring/ 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 ...

  6. HihoCode1032 最长回文子串 manacher算法

    求最长回文子串的算法比较经典的是manacher算法 转载自这里 首先,说明一下用到的数组和其他参数的含义: (1)p[i] : 以字符串中下标为的字符为中心的回文子串半径长度: 例如:abaa字符串 ...

  7. lintcode最长回文子串(Manacher算法)

    题目来自lintcode, 链接:http://www.lintcode.com/zh-cn/problem/longest-palindromic-substring/ 最长回文子串 给出一个字符串 ...

  8. 求解最长回文子串----Manacher 算法

    最长回文子串问题:给定一个字符串,求它的最长回文子串长度. 如果一个字符串正着读和反着读是一样的,那么我们称之为回文串.例如:abba.aaaa.abvcba.123321等 暴力法:遍历字符串的所有 ...

  9. 51NOD 1088 最长回文子串1089 最长回文子串 V2(Manacher算法)

    回文串是指aba.abba.cccbccc.aaaa这种左右对称的字符串. 输入一个字符串Str,输出Str里最长回文子串的长度. Input 输入Str(Str的长度 <= 1000(第二题要 ...

最新文章

  1. 基于深度连续融合的多传感器三维目标检测
  2. 武汉第二中学2021年高考成绩查询,武汉中学排名前十名,2021年武汉中学排名一览表...
  3. boyer moore算法 java_Boyer-Moore算法
  4. 系统部署文档_惊喜!Alibaba架构师终于发布“微服务架构与实践”文档
  5. 启动celery后执行任务报错:django.core.exceptions.ImproperlyConfigured
  6. mvc3中正确处理ajax访问需要登录的页面
  7. Linux学习之系统编程篇:ps 和 kill 命令以及父子进程间数据共享模式
  8. spring boot配置文件【application.yml】常见问题之一,未添加空格
  9. pandas - Series
  10. 物理内存不够用,临时增大Linux交换分区的方法
  11. Jenkins - 持续集成环境搭建【转】
  12. flask WTForms
  13. 代码快速“检”“修”不是梦,阿里云MaxCompute Studio 2.9.0 新版本发布
  14. php 获取酷狗音乐真实地址
  15. Linux进程信号(产生、保存、处理)/可重入函数概念/volatile理解/SIGCHLD信号
  16. 解决IDEA输出乱码问题
  17. HDFS基础知识(个人总结)
  18. 电商交易之订单中心设计(一)
  19. 纯前端 导出excel 插件xlsx和file-saver
  20. 多种在线地图综合对比,Google,必应,arcgis Online...

热门文章

  1. 用python画八卦图-用Python中的画图工具turtle绘制八卦图
  2. 怎么自学python-如何学习好Python这门课程?老男孩Python培训全套视频
  3. 语音识别模块解决方案
  4. access计算机二级改工号,Access新手来看:如何更改表/窗体/报表...得名字
  5. c java互通rsa_C# RSA和Java RSA互通
  6. leetcode 206 如何原地反转单链表?
  7. HEVC将会取代H.264的原因
  8. sqlserver存储过程加锁后怎么解锁_MySQL 的加锁处理,你都了解的一清二楚了吗?...
  9. 变压器绕组降低邻近效应_高功率UPS性能提升,规格/重量显著降低
  10. 在下列集成电路说法中不正确_教孩子正确认识性别,保护个人隐私,对成长中的尴尬行为说不...