左神算法进阶班1_4Manacher算法
#include <iostream>
#include <string> using namespace std; //使用manacher算法寻找字符中最长的回文子串 int Manacher(string str)
{
//字符串预处理
string newStr = "#";
for (auto c : str)
newStr = newStr + c + "#";
//回文半径记录数组
int* rIndex = new int[newStr.length()];
int c = -;//回文中心
int R = -;//回文右边界 R位于回文对称右边界的右边一个字母
int maxL = INT_MIN;//记录最长回文字长
for (int i = ; i < newStr.length(); ++i)
{
//第一步直接取得可能的最短的回文半径,当i>R时,最短的回文半径是1,
//反之,最短的回文半径可能是i对应的i'的回文半径或者i到R的距离
if (R > i)
rIndex[i] = rIndex[ * c - i] < R - i ? rIndex[ * c - i] : R - i;
else
rIndex[i] = ;
//取最小值后开始从边界暴力匹配,匹配失败就直接退出
while (i + rIndex[i] < newStr.length() && i - rIndex[i] > -)
{
if (newStr[i + rIndex[i]] == newStr[i - rIndex[i]])//向两边扩展,找回文字母
rIndex[i]++;
else
break;
}
//观察此时R和C是否能够更新
if (i + rIndex[i] > R)
{
R = i + rIndex[i];
c = i;
}
//更新最大回文半径的值
maxL = maxL > rIndex[i] ? maxL : rIndex[i];
}
delete[] rIndex;
//这里解释一下为什么返回值是maxn-1,因为manacherstring的长度和原字符串不同,
//所以这里得到的最大回文半径其实是原字符串的最大回文子串长度加1,
//有兴趣的可以自己验证试试,-1是为了将后面的‘#’去掉
return maxL - ; } void Test()
{
string str = "abc1234321ab";
cout << Manacher(str) << endl;
}
左神算法进阶班1_4Manacher算法的更多相关文章
- 左神算法进阶班1_5BFPRT算法
在无序数组中找到第k大的数1)分组,每N个数一组,(一般5个一组)2)每组分别进行排序,组间不排序3)将每个组的中位数拿出来,若偶数,则拿上 / 下中位数, 成立一个一个新数组.4)新数组递归调用BF ...
- 左神算法进阶班1_1添加最少字符得到原字符N次
Problem: 给定一个字符串str1,只能往str1的后面添加字符变成str2. 要求1:str2必须包含两个str1,两个str1可以有重合,但是不能以同一个位置开头. 要求2:str2尽量短最 ...
- 左神算法进阶班3_1构造数组的MaxTree
题目 一个数组的MaxTree定义: 数组必须没有重复元素 MaxTree是一棵二叉树,数组的每一个值对应一个二叉树节点 包括MaxTree树在内且在其中的每一棵子树上,值最大的节点都是树的头 给定一 ...
- 左神算法进阶班8_1数组中累加和小于等于aim的最长子数组
[题目] 给定一个数组arr,全是正数:一个整数aim,求累加和小于等于aim的,最长子数组,要求额外空间复杂度O(1),时间复杂度O(N) [题解] 使用窗口: 双指针,当sum <= aim ...
- 左神算法进阶班6_1LFU缓存实现
[题目] LFU也是一个著名的缓存算法,自行了解之后实现LFU中的set 和 get 要求:两个方法的时间复杂度都为O(1) [题解] LFU算法与LRU算法很像 但LRU是最新使用的排在使用频率最前 ...
- 左神算法进阶班5_4设计可以变更的缓存结构(LRU)
[题目] 设计一种缓存结构,该结构在构造时确定大小,假设大小为K,并有两个功能: set(key, value):将记录(key, value)插入该结构. get(key):返回key对应的valu ...
- 左神算法进阶班4_2累加和为aim的最长子数组
[题目] 给定一个数组arr,和一个整数aim,求在arr中,累加和等于num的最长子数组的长度 例子: arr = { 7,3,2,1,1,7,7,7 } aim = 7 其中有很多的子数组累加和等 ...
- 左神算法基础班4_1&2实现二叉树的先序、中序、后序遍历,包括递归方式和非递归
Problem: 实现二叉树的先序.中序.后序遍历,包括递归方式和非递归方式 Solution: 切记递归规则: 先遍历根节点,然后是左孩子,右孩子, 根据不同的打印位置来确定中序.前序.后续遍历. ...
- 左神算法基础班5_1设计RandomPool结构
Problem: 设计RandomPool结构 [题目] 设计一种结构,在该结构中有如下三个功能: insert(key):将某个key加入到该结构,做到不重复加入. delete(key):将原本在 ...
随机推荐
- windows下安装jenkins初级(1)
这里是基于Windows系统下安装Jenkins 首先下载jenkins 下载地址:https://jenkins.io/download/ 选择所需要的系统 我这里选择Windows 开始安装 一直 ...
- Codeforces Round #563 (Div. 2) E. Ehab and the Expected GCD Problem
https://codeforces.com/contest/1174/problem/E dp 好题 *(if 满足条件) 满足条件 *1 不满足条件 *0 ///这代码虽然写着方便,但是常数有点大 ...
- leetcood学习笔记-111-二叉树的最小深度
题目描述: 第一次提交: class Solution(object): def minDepth(self, root): """ :type root: TreeNo ...
- 【CSS】float
写在前面的话: 由于CSS内容比较多,小菜没有精力从头到尾讲一遍,只能有针对性的讲解. 如果读者理解CSS盒子模型,但对于浮动不理解,那么这篇文章可以帮助你. 小菜水平有限,本文仅仅是入门教程,不当之 ...
- Android客户端转换php服务端获取的时间戳的转换
今天在用JSON获取后台的数据的时候,发现一个奇怪的现象就是返回来的时间戳都是1970年这样的,很是纠结,最后发现时php和Java中时间的格式不一样造成的,所以我们本地客户端要做一个转换: /** ...
- 后缀自动机求LCS——spoj-LCS
经典题 注意匹配的时候:用t串去s串的SAM里进行匹配,和字典树一样遍历t中字符,用cur记录当前已经匹配的长度,如果能当前字符能匹配则cur++(这里不能直接用cur=len[now]),反之用li ...
- QString与string的相互转换【转载】
文章转载自https://blog.csdn.net/qq_33485434/article/details/80680506 1.QString转换String string s = qstr.to ...
- NX二次开发-UFUN圆弧矩阵标记、起始角和结束角(弧度测量)、圆弧中心坐标和圆弧半径UF_CURVE_ask_arc_data(边可以用)
1 NX11+VS2013 2 3 #include <uf.h> 4 #include <uf_ui.h> 5 #include <uf_modl.h> 6 #i ...
- Python对象继承set类型
Python对象继承set类型 class Feature(set): def __init__(self): set.__init__(self) # 这里演示将Feature类的加号重载成set. ...
- Java io简单总结
IO 字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的 字符流在操作时使用了缓冲区,通过缓冲区再操作文件 缓冲:一段特殊的内存.如果一个程序频繁地操作一个资源(如文件或数据库),则性能会 ...