首页 > 编程语言 >Manacher 算法

Manacher 算法

时间:2024-08-20 22:04:07浏览次数:13  
标签:字符 中心 Manacher 算法 字符串 回文

引入:万恶的字符串问题

你是否看到字符串就感到迷茫而无所适从?你是否看到“border”“回文”等字眼就感到大脑宕机只会暴力?如果你像我一样有这种症状,不妨一起来学习一下 Manacher 算法。
当你掌握了 Manacher 之后,你会发现,很多字符串问题都变成了板子,而你再也不用担心因为字符串抱零了……

某人:字符串有三种得分:\(0\),\(100\),还有无脑但不多的暴力

这么说不是在钓鱼。
某位大佬:字符串是一类很简单的困难题目。
顶级谜语人因为很多字符串问题让(尤其是像我这样的萌新)无从下手,但是如果学会了方法,你将会感觉豁然开朗,因为大多数字符串算法相比其余各种算法(比如线段树)有着较少的变形,也能较为明显地判断出来。
我们今天的 Manacher 算法就是这样一种东西,它用于求最长的回文子串(不是子序列),当然它也符合我们说的字符串算法的特征:如果你看到了一道与回文有关的题目,不妨先敲一个 Manacher 的板子,但是如果是求的其他的东西——那么就基本不用考虑 Manacher 了。

了解 Manacher

首先我们考虑怎么求出一个字符串的最长回文子串,一个非常 naive 的想法就是从第一位开始枚举,对于每一位,暴力枚举左右两边是否相同即可,这个复杂度显然是 \(\mathcal{O}(n^2)\) 的,往往不可接受,所以我们可以用 Manacher 把它的复杂度降低到 \(\mathcal{O}(n)\)。

算法流程

首先 Manacher 需要我们首先明确几个概念:

  • 回文中心:就是一个回文串的最中间那个字符,我知道你可能很迷惑一个长为偶数的回文串的回文中心是哪个,不过不急,等一会。
  • 回文边界:就是一个回文串最左边或者最右边的那个字符,这里我们统一考虑右边界。
  • 回文半径:回文中心距回文边界的距离,这里有两种定义,一种是加上回文中心,一种是不加,我采用前者。栗子:aaabaaa 这个回文串的回文中心是 b,回文半径是 \(3\) 或者 \(4\),也正是回文半径的定义不同导致了不同的写法,但是道理都是一样的。

我们考虑如何初始化,这时我们发现了一个问题,就是暴力算法有一个小 Bug:
例如 abba,这显然是一个长是 \(4\) 的回文串,但是我们的暴力算法看起来会算成 \(0\),为什么呢?其实问题就在于这四个字符哪个都不是回文中心,自然无法算出正确答案,这个玩意的回文中心其实是两个 b 之间的那个夹缝。
但是,奇数串就没有这样的烦恼。所以:

预处理

这就启发我们要把偶数串变成奇数串,Manacher 是这么做的:
在开头、结尾以及这个字符串的任意相邻的两个字符之间插入一个字符,以 # 为例(其实你想要什么都行,只要别和现有的重复了),也就是任何一个原字符两边都是 #。我们不难发现,对于以任意一个字符为回文中心的最长回文串,它的左右边界都是 #,那么这时任意一个回文串都是奇回文串,不信可以自己画一画手模一下。
那么我们就巧妙地解决了回文中心的问题。

接下来就是核心部分了

我们先来了解几个需要我们维护的信息:

  • 一个数组 \(p_i\) 表示以 \(i\) 为中心的最长回文半径。
  • 一个数 \(R\) 表示目前为止最右侧的回文右边界。
  • 一个数 \(mid\) 表示 \(R\) 对应的回文中心。

标签:字符,中心,Manacher,算法,字符串,回文
From: https://www.cnblogs.com/Tomoyuki-Mizuyama/p/18370424

相关文章

  • codetop算法
    15.三数之和复杂度显然不能暴力,卡1e9思路先排序,左边固定一个i,双指针,两边开始夹逼接近-nums[i]注意,如何跳过重复的数3.无重复字符的最长子串这个思路一定要熟练215.数组中的第K个最大元素回忆下写法53.最大子数组和基本不太会写dp究竟有什么特征?答案(定义)就......
  • 一文讲清楚算法刷题-计算机专业新生必看
    哈喽,大家好,我是Sunny,你也可以叫我萨宁,一个热爱分享编程知识的程序员。我的昵称是Sunny不要停,寓意是美好的晴朗日子不要停下来,希望大家都能每天开开心心的。我的频道主要分享编程知识,生活,大学计算机学科学习,考研经验。目前已经上岸某211计算机专业,有大学学习,考研相关的问题,欢迎关......
  • 基于RNN的交通流量预测算法及Python实现
    一、算法原理RNN(循环神经网络)的算法原理主要基于其能够处理序列数据的能力,通过引入循环连接来捕捉数据中的时序依赖性。以下是RNN算法原理的详细解释:1、基本概念序列数据:如文本、语音、视频等,这些数据具有时间顺序性,即后续数据依赖于前面的数据。循环连接:RNN中的神经元不仅......
  • 基于LSTM的交通流量预测算法及Python实现
    一、算法原理LSTM(长短期记忆网络)算法原理主要涉及到一种特殊的循环神经网络(RNN)结构,旨在解决传统RNN在处理长序列数据时容易出现的梯度消失或梯度爆炸问题。LSTM通过引入三个关键的门控机制(遗忘门、输入门、输出门)以及一个细胞状态,来更有效地处理和记忆序列数据中的长期依赖关......
  • 基于GRU的交通流量预测算法及Python实现
    一、算法原理GRU(GatedRecurrentUnit,门控循环单元)算法是一种循环神经网络(RNN)的变种,旨在解决传统RNN在处理长序列时容易出现的梯度消失或梯度爆炸问题。以下是GRU算法原理的详细解析:1、基本原理GRU通过引入门控机制来控制信息的流动,使得网络能够更好地捕捉序列数据中的长期......
  • C 语言排序算法
    C语言排序算法一、冒泡排序(BubbleSort)定义:依次比较相邻的两个元素,并按照升序或降序交换它们的位置,直到整个列表有序为止。这个过程类似于气泡在水中上升,因此得名“冒泡排序”。基本步骤:比较相邻的元素:如果第一个元素比第二个元素大或小(根据排列顺序决定),则交换他们的位......
  • 【配送路径规划】遗传算法GA求解应急物资配送路径(VRP)问题(目标函数:最低成本)【含Matlab
    ✅博主简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,Matlab项目合作可私信或扫描文章底部QQ二维码。......
  • 《数据结构》最短路径Dijkstra算法
                                    最短路径Dijkstra算法分析生长点ABCDEFP(A)=FAD(A)=130P(B)=FBD(B)=24P(C)=FCD(C)=10P(D)=——D(D)=无穷P(E)=——D(E)=无穷CP(A)=FAD(A......
  • 斯坦福大学深度解析:机器学习优化算法全攻略
    在全球人工智能研究的浪潮中,斯坦福大学以其卓越的学术成就和前沿的研究成果,一直站在该领域的前沿。今天,我们将深入探讨斯坦福大学关于机器学习优化算法的精华讲义,这份讲义不仅包含了丰富的理论知识,还有图解和Pytorch实现代码,是学习和实践机器学习优化算法的宝贵资源。↓↓↓......
  • 零基础小白看过来!人工智能到底是学习什么?算法是什么?难不难学?
    #人工智能到底是学什么?#以豆包、ChatGPt、文心一言、通义千问为代表的大模型;以百度、华为、特斯拉、蔚小理为代表的自动驾驶;以讯飞、百度为代表的语音识别技术,以及手机上的人脸识别等等,都依托于人工智能技术。可见人工智能是个广义的学科,涉及基础层、技术层、应用层的技术,......