【回文字符串】 最长回文子串O(N) Manacher算法

原理讲的清晰:Manacher‘s ALGORITHM: O(n)时间求字符串的最长回文子串

注意:

①动态生命P[]和newStr数组后,不要忘记delete[] //其实这是基本的编码习惯

②最终返回结果是P[i]-1

下面是自己写的Manacher函数

int manacher(char *src){
    int srcLen=strlen(src);
    int len=2*srcLen+2;
    char *newStr=new char[len];//还是+3??要不要给\0留个位置??不用
    int *P=new int[len];
    int i,rst=0;
    //处理字符串
    newStr[0]=‘$‘;
    newStr[1]=‘#‘;
    for(i=0;i<srcLen;i++){
        newStr[2*i+2]=src[i];
        newStr[2*i+3]=‘#‘;
    }

    //关键步骤:求P[i]
    int id=0;
    int mx=0;
    P[0]=1;
    for(i=1;i<len;i++){
        if(mx>i)
            P[i]= MIN(mx-i , P[2*id-i]);
        else
            P[i]=1;
        while(newStr[i+P[i]] == newStr[i-P[i]])
            P[i]++;//据说这一步永远不会成立
        //更新id和mx
        if(P[i]+i > mx){
            id=i;
            mx=P[i]+i;
        }
    }

    //找到P[i]中最大值,注意最终返回的结果是P[i]-1
    for(i=0;i<len;i++)
        if(rst<P[i])
            rst=P[i];

    delete[] P;
    delete[] newStr;
    return rst-1;
}

参考代码:http://blog.csdn.net/ggggiqnypgjg/article/details/6645840 用定长的char数组

http://blog.csdn.net/bruce_zeng/article/details/8629572 new动态声明后没有delete

http://blog.csdn.net/pi9nc/article/details/9251455

时间: 2024-10-20 18:15:45

【回文字符串】 最长回文子串O(N) Manacher算法的相关文章

hdu5371 最长回文子串变形(Manacher算法)

http://acm.hdu.edu.cn/showproblem.php? pid=5371 Problem Description Hotaru Ichijou recently is addicated to math problems. Now she is playing with N-sequence. Let's define N-sequence, which is composed with three parts and satisfied with the followin

51nod 1089 最长回文子串 V2(Manacher算法)

1089 最长回文子串 V2(Manacher算法) 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 回文串是指aba.abba.cccbccc.aaaa这种左右对称的字符串. 输入一个字符串Str,输出Str里最长回文子串的长度. Input 输入Str(Str的长度 <= 100000) Output 输出最长回文子串的长度L. Input示例 daabaac Output示例 5 #include <iostream> #include

回文串---最长回文

HDU   3068 Description 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度. 回文就是正反读都是一样的字符串,如aba, abba等 Input 输入有多组case,不超过120组,每组输入为一行小写英文字符a,b,c...y,z组成的字符串S 两组case之间由空行隔开(该空行不用处理) 字符串长度len <= 110000 Output 每一行一个整数x,对应一组case,表示该组case的字符串中所包含的最长回文长度. Sample

【51NOD-0】1089 最长回文子串 V2(Manacher算法)

[算法]回文树 #include<cstdio> #include<algorithm> #include<cstring> using namespace std; const int maxn=100010; struct trees{int len,fail,t[260];}t[maxn]; char s[maxn]; int n,len,l,sz,ans; int getfail(int x) { while(s[len-t[x].len-1]!=s[len])

51Nod 1092 回文字符串 | 最长公共子序列变形

求字符串和其逆的最长公共子序列,需要添加的字符数就为长度-最长公共子序列长 #include "stdio.h" #include "string.h" #define maxn 1005 char s[maxn],s1[maxn]; int dp[maxn][maxn]; int main() { int n=0,i,j,len; scanf("%s",s); len=strlen(s); strcpy(s1,s); strrev(s1); f

【最长回文子串】HDU3068最长回文【Manacher算法】

一张图领悟Manacher算法,计算字符串最长回文子串 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3068 Problem Description 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度. 回文就是正反读都是一样的字符串,如aba, abba等 Input 输入有多组case,不超过120组,每组输入为一行小写英文字符a,b,c...y,z组成的字符串S 两组case之间由空行隔开(该空行不用处理)

51nod1089最长回文子串V2

1089 最长回文子串 V2(Manacher算法) 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 回文串是指aba.abba.cccbccc.aaaa这种左右对称的字符串. 输入一个字符串Str,输出Str里最长回文子串的长度. Input 输入Str(Str的长度 <= 100000) Output 输出最长回文子串的长度L. Input示例 daabaac Output示例 5 看到这道题才特意去看了下Manacher算法:参考博客:http://blog.

1089 最长回文子串

1089 最长回文子串 V2(Manacher算法) 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 回文串是指aba.abba.cccbccc.aaaa这种左右对称的字符串. 输入一个字符串Str,输出Str里最长回文子串的长度. Input 输入Str(Str的长度 <= 100000) Output 输出最长回文子串的长度L. Input示例 daabaac Output示例 5 马拉车算法的模板题也算是又进一步理解马拉车算法了. 1 //马拉车算法 2 #i

计算字符串的最长回文子串 :Manacher算法介绍

在介绍算法之前,首先介绍一下什么是回文串,所谓回文串,简单来说就是正着读和反着读都是一样的字符串,比如abba,noon等等,一个字符串的最长回文子串即为这个字符串的子串中,是回文串的最长的那个. 计 算字符串的最长回文字串最简单的算法就是枚举该字符串的每一个子串,并且判断这个子串是否为回文串,这个算法的时间复杂度为O(n^3)的,显然无法令人 满意,稍微优化的一个算法是枚举回文串的中点,这里要分为两种情况,一种是回文串长度是奇数的情况,另一种是回文串长度是偶数的情况,枚举中点再判断是否 是回文