mannachar(马拉车)求最长回文子串
mannachar(马拉车)究竟是什么东西呢?
很简单,就是能让你在O(n)的复杂度内求出一个串的最长回文子串。传统的算法复杂度是O(n^2),呐,为什么mannachar能变快呢?因为mannachar用到了算过的东西来进行优化。脑补一下,当你发现了一个回文串,那么是不是左右就对称了呢?然后左边的最长回文子串是已经求过了,所以右边对应的点的最长回文子串至少也有那么多。
先贴一波代码
#include<cstdio>
#include<cstring>
template <typename T>inline T max(const T x,const T y){return x>y?x:y;}
template <typename T>inline T min(const T x,const T y){return x<y?x:y;}
char s[11000001],t[22000010];
int p[22000002],len,l;
int main()
{scanf("%s",s+1),len=strlen(s+1);t[l++]='$',t[l++]='#';for(register int i=1;i<=len;i++)t[l++]=s[i],t[l++]='#';int maxx=0,num=0,res=0;for(register int i=0;i<l;i++){p[i]=maxx>i?min(p[(num<<1)-i],maxx-i):1;while(t[i+p[i]]==t[i-p[i]])p[i]++;if(i+p[i]>maxx){maxx=i+p[i];num=i;}res=max(res,p[i]);}printf("%d",res-1); return 0;
}
它的复杂度是O(n)的,为什么呢?请看我的代码中的maxx这个变量表示现在最长回文子串的右边界的最远值,最多移动n次,复杂度就证好啦
其实mannachar并不难,不过说实话用的场合不是很多,所以嘛,学一下,掌握一下就好啦,再去学字符串的其它算法组合一下就能做出一些题啦
mannachar(马拉车)求最长回文子串相关推荐
- Manacher马拉车算法求最长回文子串
终于把马拉车算法搞明白了!赶紧记录一下. 这个算法用于查找一个字符串的最长回文子串 马拉车算法依次给数组p[i]赋值,马拉车算法的本质就是在每次给数组p[i] 赋值时尝试进行偷懒 例如,当要给p[6] ...
- 马拉车算法(manacher)求最长回文子串
关于回文字符串的概念大家可以大致去搜索一下,这里不赘述. 一.解题思路 当前字符串 最长回文子串: 思路实际上很简单,就是遍历每一个元素,然后分别以这个元素为中心,向两边扩展,比如说现在i = 4,那 ...
- Manacher 求最长回文子串算法
Manacher算法,是由一个叫Manacher的人在1975年发明的,可以在$O(n)$的时间复杂度里求出一个字符串中的最长回文子串. 例如这两个回文串"level"." ...
- python求回文_python实现求最长回文子串长度
给定一个字符串,求它最长的回文子串长度,例如输入字符串'35534321',它的最长回文子串是'3553',所以返回4. 最容易想到的办法是枚举出所有的子串,然后一一判断是否为回文串,返回最长的回文子 ...
- 字符串处理 —— 回文串相关 —— 求最长回文子串
[暴力枚举] 求最长回文串最容易的方法就是暴力枚举,求出字符串的每一个子串,然后判断是不是回文,找到最长的那个回文串 求每一个子串的时间复杂度为 O(N^2),判断一个子串是不是回文时间复杂度为 O( ...
- 马拉车java_leetcode-5 最长回文子串-画蛇添足的马拉车算法
leetcode-5 最长回文子串 题目 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: "babad" 输出: &q ...
- 【HDU - 3068】最长回文(Manacher算法,马拉车算法求最长回文子串)
题干: 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度. 回文就是正反读都是一样的字符串,如aba, abba等 Input 输入有多组case,不超过120组 ...
- (力扣)中心扩散法求最长回文子串
Question: 给定一个字符串,输出其中最长的回文子串. 几种解法: 暴力枚举:时间复杂度:O(n3)(略) (双层枚举:O(n2)判断是否为回文串:O(n)) 动态规划:时间复杂度O(n2),空 ...
- 求最长回文子串——C++ (动态规划+暴力解法)
声明:本文原题主要来自力扣,记录此博客主要是为自己学习总结,不做任何商业等活动! 一.题目描述 给你一个字符串 s,找到 s 中最长的回文子串. 示例 1: 输入:s = "babad&qu ...
最新文章
- Java Socket 客户端使用指定端口多次连接服务器引发 BindException
- Restlet Client 安装 网盘里面有压缩文件夹下载引用即可 谷歌浏览器
- pytorch中深度拷贝_pytorch:对比clone、detach以及copy_等张量复制操作
- 查看Linux内核版本、系统版本命令
- REST与RESTful
- kafka消费者分区的分配的三种机制
- windows server 2003 AD之FSMO角色
- vba 服务器上删除文件夹,Excel vba 如何操作文件夹的创建以及删除
- 在哪里学python-在合肥学习Python去哪
- 【操作系统】Mac环境配置
- 如何安装python3.6_python3.6环境下如何安装freetype库和基本使用方法
- 用protobuf进行C#与Java通信
- spss相关分析(spss统计分析实验教程,谢蕾蕾)
- 如何写出一篇好的软文?软文撰写的一些注意事项!
- 计算机科学家手抄报图片,关于简洁又漂亮的科学手抄报图片
- python逻辑量是什么意思_python 逻辑术语
- 笔记本显示dns服务器,笔记本电脑显示无线网DNS设置错误该怎么解决
- Linux 将普通用户改成root用户
- MosMedData: 新冠肺炎胸部 CT扫描数据集上基于3D-CNN实现二分类
- LeetCode 1155. 掷骰子的N种方法 每日一题