1. 暴力

时间复杂度O(n^3)。

2. 延展

以某一字符为中心,设置left, right两个变量同时向外扩,判断他们指向字符是否相同。注意分奇偶讨论。时间复杂度O(n^2)。

3. Manacher 马拉车

代码注释:

 1 const int MAXN = 110009;
2 char ma[MAXN * 2]; //因为要添加'#',所以长度要开两倍
3 int mp[MAXN * 2];
4 char s[MAXN];
5
6 void Manacher(char s[], int len) {
7
8 // 1. 构造字符串,添加'#',使长度变为奇数(2 * len - 1)
9 int l = 0;
10 ma[l++] = '$'; // 设置边界
11 ma[l++] = '#';
12 for(int i = 0; i < len; i ++) {
13 ma[l++] = s[i];
14 ma[l++] = '#';
15 }
16 ma[l] = 0;
17
18 // 核心: 求回文半径, 回文半径包括中心点
19 int mx = 0; // mx代表可达的最右值
20 int id = 0; // id代表mx的中心
21 for(int i = 0; i < l; i ++) {
22 mp[i] = mx > i ? min(mp[2 * id - i], mx - i) : 1;
23 while(ma[i + mp[i]] == ma[i - mp[i]]) {
24 mp[i] ++;
25 }
26 if(i + mp[i] > mx) {
27 mx = i + mp[i];
28 id = i;
29 }
30 }
31
32 }
33
34 int main()
35 {
36
37 while(scanf("%s", s) != EOF) {
38 int len = strlen(s);
39 Manacher(s, len);
40 int ans = 0;
41 for(int i = 0; i < 2 * len + 2; i ++) { // 寻找最长的回文半径,即回文串长度
42 ans = max(ans, mp[i] - 1); // 回文半径减1就是原回文串的长度(回文半径中虚加了#)
43 cout << mp[i] << " ";
44 }
45 printf("%d\n", ans);
46 }
47
48 return 0;
49 }

时间复杂度O(n)。

判断最长回文串——暴力、延展、Manacher的更多相关文章

  1. Manacher算法 - 求最长回文串的利器

    求最长回文串的利器 - Manacher算法 Manacher主要是用来求某个字符串的最长回文子串. 不要被manacher这个名字吓倒了,其实manacher算法很简单,也很容易理解,程序短,时间复 ...

  2. Longest Palindrome 最长回文串问题

    1.题目 Given a string s, find the longest palindromic substring in s. You may assume that the maximum ...

  3. 算法 -- 四种方法获取的最长“回文串”,并对时间复杂进行分析对比&PHP

    https://blog.csdn.net/hongyuancao/article/details/82962382 “回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就 ...

  4. MANACHER---求最长回文串

    求最长回文串,如果是暴力的方法的话,会枚举每个字符为中心,然后向两边检测求出最长的回文串,时间复杂度在最坏的情况下就是0(n^2),为什么时间复杂度会这么高,因为对于每一个作为中心的字符的检测是独立的 ...

  5. 字符串的最长回文串:Manacher’s Algorithm

    题目链接:Longest Palindromic Substring 1. 问题描述 Given a string S, find the longest palindromic substring ...

  6. Leetcode0005--Longest Palindromic Substring 最长回文串

    [转载请注明]http://www.cnblogs.com/igoslly/p/8726771.html 来看一下题目: Given a string s, find the longest pali ...

  7. Manacher模板(O(n)内求最长回文串长度)

    转自:https://segmentfault.com/a/1190000008484167 /* 由于回文分为偶回文(比如 bccb)和奇回文(比如 bcacb),而在处理奇偶问题上会比较繁琐,所以 ...

  8. ACM题目————最长回文串

    Description 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度. 回文就是正反读都是一样的字符串,如aba, abba等   Input 输入有多组cas ...

  9. Manacher's Algorithm 马拉车算法(求最长回文串)

    作用:求一个字符串中的最长子串,同时还可以求所有子串的长度. 题目链接: https://vjudge.net/contest/254692#problem/B 最长回文串长度的代码: int Man ...

随机推荐

  1. Restful API 接口设计标准及规范

    Restful API 接口设计标准以及规范 RESTful概念 理解和评估以网络为基础的应用软件的架构设计,得到一个功能强.性能好.适宜通信的架构.REST指的是一组架构约束条件和原则." ...

  2. C#访问Access数据库提示未安装ISAM

    解决办法 1.在前面加上Jet OLEDB:,如: Jet OLEDB:Database Password='zt' <add name="ConStrOleDb" conn ...

  3. C#中RDLC控制某列的显示隐藏

    使用 1.添加参数IsEnable(用于控制显示或隐藏)2.在RDLC页面,需要控制的列上,右键,列的可见性...,基于表达式隐藏或显示3.输入 IIF(Parameters!IsEnable.Val ...

  4. Docker - 配置加速器

    https://www.daocloud.io/mirror#accelerator-doc curl -sSL https://get.daocloud.io/daotools/set_mirror ...

  5. postgre sql递归查询

    WITH  RECURSIVE  r  AS (SELECT * FROM [表] WHERE id = xxxunion ALLSELECT [表].* FROM [表], r WHERE [表]. ...

  6. 在开发板上显示英文字符和汉字--tiny6410

    程序字符需要改成gb2312.否则无法正常显示中文字符. main.c代码: #include <sys/types.h> #include <sys/stat.h> #inc ...

  7. 【Go】四舍五入在go语言中为何如此困难

    四舍五入是一个非常常见的功能,在流行语言标准库中往往存在 Round 的功能,它最少支持常用的 Round half up 算法. 而在 Go 语言中这似乎成为了难题,在 stackoverflow ...

  8. 探讨EFCore如何优雅的实现读写分离

    前言     我们都知道当单库系统遇到性能瓶颈时,读写分离是首要优化手段之一.因为绝大多数系统读的比例远高于写的比例,并且大量耗时的读操作容易引起锁表导致无发写入数据,这时读写分离就更加重要了.   ...

  9. java枚举类学习笔记总结

    枚举类的说明: 1.枚举类的理解:类的对象只有有限个,确定的.我们称此类为枚举类 2.当需要定义一组常量时,强烈建议使用枚举类 3.如果枚举类中只一个对象,则可以作为单例模式的实现方式. 如何自定义枚 ...

  10. python 文章集合

    Python profiling tools 我常用的 Python 调试工具