初学Manacher算法必会的一道板子题

Manacher算法是计算字符串中每个位置作为回文中心的回文半径的算法,那么就可以衍生出一道题,如何计算出一个字符串的最长回文子串,说的就是这个板子题

基本模板如下:

int C = 0,R = 0;//初始都从0开始
for(int i=1;i<=2*n +1;++i)
{
    p[i]=iR)C=i,R = i + p[i];
}

基本思路:

首先,读入字符串 a。将 a 进行预处理,构造新的字符串 s。其中,s 的长度是 n,字符串中的每个字符之间会插入特殊字符 #,以及两个边界字符 ! 和 @。初始化一些辅助变量,包括当前已知最右回文半径的中心位置 pos,以及与其对应的回文串中心位置 id使用循环遍历字符串 s,从第一个字符到最后一个字符。在循环中,首先判断当前遍历的位置是否已经在已知回文半径范围内。如果是,则更新当前位置的回文半径,可以直接利用对称性得到。如果当前位置不在已知回文半径范围内,那么需要从头开始匹配回文半径。使用双指针技巧,从当前位置向两边进行扩展,直到不满足回文条件为止。同时,更新当前位置的回文半径。如果当前位置加上回文半径超过了已知回文半径范围,则需要更新已知回文半径范围。最后,遍历整个 p 数组,找到最大的回文半径(减去1后即为最长回文子串的长度)。

原题链接为:

https://www.lanqiao.cn/problems/1225/learning/?page=1&first_category_id=1&tags=Manacher

你可能感兴趣的:(算法,c++)