最长回文

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 5158    Accepted Submission(s): 1755

Problem Description
给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度.
回文就是正反读都是一样的字符串,如aba, abba等
Input
输入有多组case,不超过120组,每组输入为一行小写英文字符a,b,c...y,z组成的字符串S
两组case之间由空行隔开(该空行不用处理)
字符串长度len <= 110000
Output
每一行一个整数x,对应一组case,表示该组case的字符串中所包含的最长回文长度.
Sample Input
aaaa
abab

Sample Output
4
3
最长回文字串
一、暴力算法(O(n^3))
三个for循环
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <cmath>
#include <vector>
#include <set>
#include <map>
#include <algorithm>
using namespace std;
typedef long long ll;
int main()
{char a[1000006];int i,j,k,maxn=0;cin>>a;for(int i=0;a[i]!='\0';i++)a[i]=toupper(a[i]);int len=strlen(a);for(i=0;i<len;i++){for(j=i;j<len;j++){int ok=1;for(k=i;k<=j;k++){if(a[k]!=a[i+j-k]) ok=0;}if(ok)maxn=max(maxn,j-i+1);}}cout<<maxn<<endl;return 0;
}

二、优化算法(O(n^2))ps:分奇偶讨论

确定中心字符,两边扩展。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <cmath>
#include <vector>
#include <set>
#include <map>
#include <algorithm>
using namespace std;
typedef long long ll;
int max(int a,int b){return a>b?a:b;
}
int main()
{char a[1000006];int n;cin>>n;while(n--){int i,j,maxn=0,len;cin>>a;len=strlen(a);for(i=0;i<len;i++){for(j=0;i-j>=0 && i+j<len;j++){if(a[i-j]!=a[i+j]) break;else maxn=max(maxn,j*2+1);}for(j=0;i-j>=0 && i+j+1<len;j++){if(a[i-j]!=a[i+j+1]) break;else maxn=max(maxn,j*2+2);}}cout<<maxn<<endl;}return 0;
}

三、manacher算法(O(n))ps:优化后的第二种算法

在第二种算法中,每次都确定中心字符两边扩展,并且分奇偶讨论,因此每次操作都会有不必要的操作,而manacher算法就是在每两个字符之间插入'#'字符,从而不需要分奇偶讨论。确定一个中心后,找上一个中心的标记点,标记点加上标记半径判断该点的初始回文状态即p[i]=min(p[id+id-i],p[id]+id-i].

然后在p[i]的基础上扩展当下点的标记半径。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <cmath>
#include <vector>
#include <set>
#include <map>
#include <algorithm>
using namespace std;
typedef long long ll;
int p[2000006];
char a[2000006];
int main()
{while(cin>>a){memset(p,0,sizeof(p));int len=strlen(a),id=0,maxlen=0;for(int i=len;i>=0;--i){a[(i<<1)+1]='#';a[(i<<1)+2]=a[i];}     a[0]='#';for(int i=2;i<2*len-1;i++){if(p[id]+id>i) p[i]=min(p[id*2-i],p[id]+id-i);else p[i]=1;while(a[i-p[i]]==a[i+p[i]]) ++p[i];if(id+p[id]<i+p[i])id=i;if(maxlen<p[i])maxlen=p[i];}cout<<maxlen-1<<endl;}return 0;
}

hihocode上的这道题就很简单了http://hihocoder.com/problemset/problem/1032

转载于:https://www.cnblogs.com/shinianhuanniyijuhaojiubujian/p/7128133.html

最长回文子串 hihocode 1032 hdu 3068相关推荐

  1. hiho一下第一周 Hihocoder #1032 : 最长回文子串

    #1032 : 最长回文子串 时间限制:1000ms 单点时限:1000ms 内存限制:64MB 描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在 ...

  2. HDU 4745 Two Rabbits——最长回文子串

    这道题实际上是求一个序列的最长回文子串的长度,关于最长回文子串请看http://blog.csdn.net/hao_zong_yin/article/details/72730732 这道题的特殊性就 ...

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

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

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

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

  5. 最长回文子串manacher算法模板

    #1032 : 最长回文子串 时间限制:1000ms 单点时限:1000ms 内存限制:64MB 描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在 ...

  6. leetcode 5 :Longest Palindromic Substring 找出最长回文子串

    题目: Given a string S, find the longest palindromic substring in S. You may assume that the maximum l ...

  7. python【力扣LeetCode算法题库】5- 最长回文子串

    5. 最长回文子串 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: "babad" 输出: "bab&quo ...

  8. leetcode算法题--最长回文子串

    题目链接:https://leetcode-cn.com/problems/longest-palindromic-substring/ 相关题目:最长回文子序列 动态规划 dp[i][j]表示从i到 ...

  9. LeetCode:Longest Palindromic Substring 最长回文子串

    Given a string S, find the longest palindromic substring in S. You may assume that the maximum lengt ...

最新文章

  1. 移动应用开发—— 如何搭建开发大型的应用架构?
  2. 新手C#string类常用函数的学习2018.08.04
  3. 网站被降权后该如何操作?
  4. linux中的网络体系结构
  5. MySQL(查看数据文件目录)
  6. Spring Boot 如何解决多个定时任务阻塞问题?
  7. mysql 查询商品列表 显示tag_让前台页面商品列表显示后台数据库中的商品
  8. .net core 3.1 mysql_.net core3.1 MVC使用sqlsugar方式操作mysql数据库
  9. MYSQL禁用与启用事件
  10. sql 日期和当前日期时间差_SQL基础进阶16日期处理
  11. C++基础——类继承中方法重载
  12. 【Python】如何在Python项目中使用相对路径正确的导入模块/包
  13. 关于元素水平垂直居中的那些事?
  14. python求向量夹角
  15. CocosCreator之绳索摆动效果
  16. 什么是天使轮、A轮、B轮、C轮、D轮融资
  17. CentOS 7 完美安装redis-5.0.5
  18. Android 自定义二维码
  19. 【建议星星】要就来45道Promise面试题一次爽到底(1.1w字用心整理)
  20. 100道经典Hadoop常见面试/笔试题及答案解析

热门文章

  1. Metrics.NET 项目
  2. Linux系统的文件句柄数量问题
  3. Quora Andy Barton
  4. Windows 2003 主域控和DNS迁移到Windows 2008 R2(2)
  5. Leetcode 373. 查找和最小的K对数字 解题思路及C++实现
  6. TensorFlow example示例 Process finished with exit code -1073741819 (0xC0000005)
  7. MySQL 命令行下执行.sql脚本
  8. Windows XP硬盘安装Ubuntu 11.10双系统全程图解
  9. Ribbon 负载均衡调用04——ribbon 负载均衡算法||手写轮询算法(原理+JUC)CAS+自旋锁
  10. Python 技术篇 - 微信调用图灵机器人的api接口实现自动回复实例演示。图灵机器人的注册与使用