最长回文串

news/2024/11/30 9:41:01/

Manacher

问题

寻找字符串中的最长回文串

传统做法

  • 字符串首字符前加一个特殊字符 ‘#’ 末尾字符加一个特殊字符 ‘#’ 相邻字符间也加上特殊字符 ‘#’

  • 遍历字符串,除特殊字符外,以每个字符作为回文字符串的中心向外扩张

思考

很明显这种做法的时间复杂度是很高的,所以采用manacher进行提速

提速

数据

记录数据R表示目前最长回文串的的半径

记录数据M表示目前最长回文串的中心

数组parr存储每个字符为中心的最长回文串的半径

思路

根据遍历字符下标iR的关系分为以下情况

  1. iR范围外,则自己往外扩

  2. iR范围内,根据以M做对称点的i'情况分为三种情况

  • parr[i']R范围内,但不与R边缘位置重叠,则parr[i] = parr[i']

  • parr[i']超出R范围,则parr[i] = R - i

  • parr[i']R范围内,与R边缘位置重叠,也是自行扩,有一段距离不用判断: R - i

实现

string f1(string str)
{string res;for(int i = 0;i < str.size() * 2 + 1;i++){res += i & 1 ? str[i / 2] : '#';}return res;
}
​
int f2(string str)
{if(str.size() == 0) return 0;int R = -1;int M = -1;string pstr = f1(str);int* parr = new int(pstr.size());int Rmax = INT32_MIN;for(int i = 0;i < pstr.size();i++){/******不用判断的半径******/int parr[i] = R > i ? min(parr[2 * M - i],R - i) : 1;while(i + parr[i] < pstr.size() && i - parr[i] > -1){if(str[i + parr[i]] == str[i - parr[i]]){parr[i]++;}else break;}if(parr[i] + i > R){R = i + parr[i];M = i;}Rmax = max(Rmax,parr[i]);}delede[] parr;return Rmax - 1;
}

思考

parr[i'] 在R范围内

 R范围内已是回文串且以M为中心点,所以M做对称点的i'的半径结果,就是i的半径结果

parr[i'] 超出R范围内

i的半径结果为R - i,不可能为更大

R - i 为什么不可能更大

 如图,假设i开始还可以往外扩,则? = b ;以M为中心,? 的对称点也为b,那R的值应该更大才对,可是R之前并没有扩到那么大,所以假设不成立

parr[i'] 在R范围内,但与R重叠

 此情况下i是可以往外扩的,不会影响R值,可以用上面的方法印证

总结

不同情况下,扩与不扩分析,需要理解清楚


http://www.ppmy.cn/news/691834.html

相关文章

Java程序所在机器性能监控

Java程序所在机器性能监控 背景 问题单&#xff1a;程序故障&#xff08;OOM、网络不通、操作卡顿&#xff09;问题单&#xff1a;服务连接不上需求 1、监控本地机器性能 告警日志UI2、监控服务接口服务 告警日志UI方案 固定间隔获取机器网络CPU内存数据设置阈值&#xff0c;告…

探探提醒对方账号异常_我告诉你探探账号异常不能回复消息怎么办

解决方法&#xff1a;有多种原因&#xff0c;如果是账号被封&#xff0c;无法回复短信&#xff1b;如果是网络异常导致&#xff0c;建议切换网络再回复&#xff1b;如果是软件出现bug&#xff0c;可以进行反馈&#xff0c;在探探3.7.5版本中&#xff0c;打开软件&#xff0c;点…

探探提醒对方账号异常_探探账号异常暂时不能回复你的消息怎么回事?如何解封...

探探是一款不错的社交app&#xff0c;有时候大家给朋友发送消息时&#xff0c;显示对方账号异常暂时不能回复消息&#xff0c;那么探探账号异常是怎么回事呢&#xff1f;探探账号封禁怎么办呢&#xff1f;下面小编就为大家带来探探app账号异常的相关介绍&#xff0c;感兴趣的朋…

探探引流一天加粉1000+微商引流方法讨论

探探引流一天加粉1000微商引流方法讨论 关于探探引流&#xff0c;已经见怪不怪&#xff0c;但是最近封杀实在严重&#xff0c;软改必死&#xff0c;硬改也不见得活&#xff0c;但是我们经过摸索还是有自己的一套活号方法&#xff0c;现在说下几个新手应该避开的雷区 1.软改 所…

怎么取消苹果手机自动续费_探探怎么取消自动续费

相信很多购买过探探VIP的人遇到过这样的问题&#xff0c;探探在没有取消订阅的情况下&#xff0c;购买了几个月的VIP会员到期了后会又自动续期&#xff0c;因而会导致直接扣费。那么&#xff0c;不想续期探探会员时探探怎么取消自动续费呢&#xff1f;请看下面的步骤。 探探怎么…

react实现聊天界面_taro+react仿微信App聊天实例|taro聊天室

taroChatRoom聊天室是基于taro+react+redux+RN+taropop等技术开发的仿微信App界面聊天IM项目,实现了消息发送、表情动图、预览图片、红包、朋友圈等功能。 Taro多端实践:仿微信聊天室 (H5+小程序+App) 技术实现:编码/技术:Vscode + react/taro/redux/react-native iconfont…

我欲成仙

还记得去年快要回家的时候的激动样、特别是快要下车的那一刻。不过现在又回到公司来上班了&#xff01;在家的时候、基本上酒就没有断过、但是我又喝不了多少。回家的那天是跟叔叔、还有几位堂哥喝、大年三十是跟爷爷、奶奶喝。初一也是跟爷爷喝、不过是跟四爷爷喝。人生第一次…

图解ARP协议(三)ARP防御篇-如何揪出“内鬼”并“优雅的还手”?

一、ARP防御概述 通过之前的文章&#xff0c;我们已经了解了ARP攻击的危害&#xff0c;黑客采用ARP软件进行扫描并发送欺骗应答&#xff0c;同处一个局域网的普通用户就可能遭受断网攻击、流量被限、账号被窃的危险。由于攻击门槛非常低&#xff0c;普通人只要拿到攻击软件就可…