码迷,mamicode.com
首页 > 其他好文 > 详细

[算法]manachar最长回文子串

时间:2014-07-01 13:11:29      阅读:245      评论:0      收藏:0      [点我收藏+]

标签:des   style   blog   color   os   问题   

现给定一个已知的字符串str[],现在想要在O(n)的时间复杂度之内求出一个最长的回文子字符串(正着和倒着顺序读一致)。

Manacher最早发现了可以用O(n)的时间复杂度来解决该问题,所以这种方法称之为Manacher算法。

#include <iostream>
using namespace std;
int min(int a, int b){
    return a > b ? b : a;
}
char* preproccess(char* src, char* des){
    int j = 0;    
    des[j++] = $;
    des[j++] = #;
    for(int i = 0; 0 != src[i]; ++i){
        des[j++] = src[i];
        des[j++] = #;
    }
    des[j] = 0;
    return des;
}
void manachar(char* str,int* p){
    int mx = 0, id;
    p[0] = 0;
    for(int i = 1; 0 != str[i]; ++i){
        if(mx > i){
            p[i] = min(mx - i, p[2*id - i]);
        }
        else{
            p[i] = 1;
        }
        while(str[i - p[i]] == str[i + p[i]]){
            ++p[i];
        }
        if(p[i] + i > mx){
            mx = p[i] + i;
            id = i;
        }
    } 
}

 

[算法]manachar最长回文子串,布布扣,bubuko.com

[算法]manachar最长回文子串

标签:des   style   blog   color   os   问题   

原文地址:http://www.cnblogs.com/zhengyuhong/p/3817158.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!