字符串---Manacher

作者: 哟破赛呦 | 来源:发表于2019-01-17 14:51 被阅读26次

求最长回文子串

求一个串中的回文子串,首先将字符串处理成奇数个。
"abbc"处理成Ma = "$ a # b # b # c #"
然后求出以每个字符为中心的回文半径Mp
最大的那个回文半径就对应着最长的回文子串
代码中id指以这个点为中心半径可以达到右边最远,达到的位置是mx
2*id-i 指的是i关于 id的对称位置i",(i肯定在id的右边,因为是从左往右遍历处理)
设当前位置为i,要计算Mp[i]:
如果,mx>i(图1,2),即id处的回文半径能够覆盖当前位置,那么i的对称位置i"一定也在以id为中心的回文串中,并且 i"位于id左边,已经处理过,Mp[2*id-i]就是i"的回文半径。
这时候计算i的回文半径还分两种情况。mx-i > Mp[2*id-i]mx-i < Mp[2*id-i],分别对应图1,2。Mp[i]的值选取两者中小的那一个。因为图中只有同时被红色和绿色覆盖的,才关于i对称,其他的未知。

image
如果,mx <= i(图3),那么i的回文半径只能通过一次次比较求得。
细节见代码
namespace Manacher{
    const int MAXN = 100;//字符串最大长度
    char Ma[MAXN*2];//处理后的字符串
    int Mp[MAXN*2];//每个位置的回文半径,max(Mp[i])-1就是最长回文长度
    int Manacher(const char s[], int len){
        int l = 0, ret = 0;
        Ma[l++] = '$';
        Ma[l++] = '#';
        for(int i = 0; i<len; i++){
            Ma[l++] = s[i];
            Ma[l++] = '#';
        }
        Ma[l] = 0;
        int mx = 0, id = 0; //从id处回文半径可以达到mx处
        for(int i = 0; i < l; i++){
            Mp[i] = mx > i ? min(Mp[2*id-i], mx - i) : 1;
            while(Ma[i + Mp[i]] == Ma[i - Mp[i]]) Mp[i]++;
            ret = max(Mp[i]-1,ret);
            if(i + Mp[i] > mx){
                mx = i + Mp[i];
                id = i;
            }
        }
        return ret;
    }
}

例题

POJ3974 裸题

相关文章

  • leetcode第5题 最长回文子串

    @(leetcode)[字符串,动态规划,manacher算法] leetcode 5 Longest Palin...

  • 字符串---Manacher

    求最长回文子串 求一个串中的回文子串,首先将字符串处理成奇数个。如"abbc"处理成Ma = "$ a # b #...

  • hdu 3068 Manacher

    hdu 3068求一个字符串的最长回文长度。套用Manacher模板即可。

  • JavaScript Manacher 算法

    Manacher 算法 当一段字符串正序倒序都一样的成为回文:12321 就是回文字符串 manacherStri...

  • Manacher's algorithm

    Manacher算法主要解决的问题是求给定字符串中最长的回文字符串。 以前咱们求解回文字符串的步骤是找中心点, ...

  • Manacher's Algorithm 的理解

    在 leetcode 刷题刷到求字符串的最长回文字串,而马拉车算法(Manacher's Algorithm), ...

  • 一文弄懂Manacher算法

    今天我们来介绍一下处理回文字符串的算法:Manacher(俗称“马拉车”)。 算法功能 回文字符串的通俗定义是:如...

  • 递归转迭代通用方法

    KMP:查找字符串是否包含另外一个字符串,时间复杂度O(N),普通做法O(n2)Manacher算法:查找字符串里...

  • 最长回文子串

    最长回文子串——Manacher 算法 1. 问题定义 最长回文字符串问题:给定一个字符串,求它的最长回文子串长度...

  • Manacher's Algorithm算法分析Java

    Manacher's Algorithm俗称马拉车算法,对于求字符串中最长回文子串效率极高。 在求最长回文子串的时...

网友评论

    本文标题:字符串---Manacher

    本文链接:https://www.haomeiwen.com/subject/dekidqtx.html