左神算法基础提升--3

文章目录


Manacher 算法

经典算法

在每学习Manacher算法之前我们可能会使用一种比较经典暴力的算法:遍历str字符串,将字符串中的每个字符作为对称点,向两边扩散找到回文字段,并与最长进行比较,直到找到最长回文子串。

但这种算法有一个问题:他无法找到偶数的回文子串,因为偶数回文子串的对称轴不在字符串中,而是一条虚线。

为了解决这个问题,我们需要采用填补的方法将原字符串通过使用某一种特定的字符填补。

通过这种方法便能够找到填补后的字符串的最长回文子串的长度,再将字符串中每个节点长度除以2便能找到原字符串中最长回文子串的长度。

需要注意的是,填补的字符可以是任意的甚至是原字符串中出现都没关系,都能找到正确的结果、

这种方法虽然能够找到正确的答案,但是其所需时间较长。其时间复杂度为O(n^2).

Manacher算法原理

Manacher算法和KMP算法类似,均是找到其内部的数学规律,借助其他的数据结构减少重复计算。

在学习Manacher算法前我们需要了解两个定义:1.回文半径数组;2.最右回文右边界;

回文半径数组是指:找到填补后的字符串的每一个字符为中心的回文半径。

最有回文右边界是指:找到的属于回文的最右的右边界。

在了解上面的概念后,边可以使用Manacher算法进行优化了。

对算法进行优化主要分为种情况:

1.选定为中心的字符在最右回文右边界的左边;

在这种情况下,与前文提到的暴力方法相同,直接暴力扩展。

2.选定为中心的字符在最右回文右边界里;这种情况又分为两种

①该点与最右回文右边界的对称点对称的点所在的回文半径数值小于该点到最右回文右边界的距离;

此时该点的最长回文子串长度与其对称点长度相同。

②该点与最右回文右边界的对称点对称的点所在的回文半径数值大于该点到最右回文右边界的距离;

此时该点的最长回文子串长度为该点到最右回文右边界的距离。

③该点与最右回文右边界的对称点对称的点所在的回文半径数值恰好恰好等于该点到最右回文右边界的距离;

在这种情况下,我们需要接着进行尝试,看看该点能不能找到一个更大的最长回文子串。

完整代码

单调栈或单调队列

在求解这道题时,我们可以使用双端队列进行求解,我们在双端队列中维持一个单调性,按从大到小的顺序依次将窗口内的下。在窗口往右移动的时候,依旧保持这个单调性,并将新加入的数组中的数的下标从尾部加入双端队列中;

在窗口往左移动的时候,判断当前是否已经移动过了双端队列内的下标,如果移动过了即双端队列中的下标有些已经不在窗口内了,便将他们从头部弹出。

这个双端队列实际上存放的是窗口以此往右移动依次过期的最大值。

代码:



对于这道题,我们需要使用单调栈实现。

我们先创建一个栈,并在栈中维持好从小到大的单调性。依次将数组中的数加入到栈中,如果一个数加入后会破坏其单调性,我们便需要将其弹出,同时使其弹出的数便是从右离这个数最近且比这个数小的数,其在栈中的下个数便是比该数小且左边离该数最近的数。

相关推荐
CoovallyAIHub18 分钟前
医药、零件、饮料瓶盖……SuperSimpleNet让质检“即插即用”
深度学习·算法·计算机视觉
dragoooon3422 分钟前
[优选算法专题二滑动窗口——串联所有单词的子串]
数据结构·c++·学习·算法·leetcode·学习方法
刃神太酷啦23 分钟前
C++ 异常处理机制:从基础到实践的全面解析----《Hello C++ Wrold!》(20)--(C/C++)
java·c语言·开发语言·c++·qt·算法·leetcode
Brookty1 小时前
【算法】双指针(二)复写零
学习·算法
胖达不服输1 小时前
「日拱一码」081 机器学习——梯度增强特征选择GBFS
人工智能·python·算法·机器学习·梯度增强特征选择·gbfs
初级炼丹师(爱说实话版)2 小时前
2025算法八股——深度学习——优化器小结
人工智能·深度学习·算法
努力的小帅2 小时前
C++_哈希
开发语言·c++·学习·算法·哈希算法·散列表
Christo32 小时前
TFS-2023《Fuzzy Clustering With Knowledge Extraction and Granulation》
人工智能·算法·机器学习·支持向量机
过河卒_zh15667662 小时前
AI内容标识新规实施后,大厂AI用户协议有何变化?(二)百度系
人工智能·算法·aigc·算法备案·生成合成类算法备案
薰衣草23332 小时前
滑动窗口(2)——不定长
python·算法·leetcode