manacher算法(求最长子回文)

首先介绍两个变量概念:

回文右边界(R):能扩到的右边界。

回文中心(C):扩到最右边界时的回文中心

算出任意位置i所能得到的回文半径一共有两种大的可能。

1.(可能性一)回文右边界在左边,暴力扩

2.回文右边界在右边或在回文右边界上,作回文中心的对称点 i'

(可能性二) i' 的回文半径彻底在左右回文串边界里面---------i的回文半径不用扩,一定和 i' 一样

(可能性三)i' 的回文半径彻底不在左右回文串边界里面---------i的回文半径就是i->r这段间隔

(可能性四)i'的回文半径正好在左右回文串边界上--------i的回文半径从i->r不用验,后面的要自己验。

//Manacher算法:查找一个字符串中最长回文串

#include
using namespace std;

//填充源字符串
vector manacherstring(vector a)
{
	vector str;
    str.push_back( '#' );
    for( int i=0;i randomstring()
{

	vector str;
	for(int i=0;i<10000;i++)
	{
		str.push_back( rand()%26+'a' );
	}
	return str;
}

//暴力向两边扩
int simplehuiwen(vector vec)
{
    int res=1;
    int len=vec.size();
	for(int i=0;i=0&&i+gap<=len-1 )
        {
            //cout< vec)
{
    //定c为回文中心,r为回文半径的右边界
    int c=-1;
    int r=-1;
    int res=1;
    int veclen=vec.size();
    //记录每个位置能扩到的右边界
    int* pArr=new int[veclen];
    memset( pArr,0,sizeof(pArr) );
    for( int i=0;ii ? min( pArr[2*c-i],r-i ) : 1;

        //每种情况都尝试向外扩
        while( i-pArr[i]>=0&&i+pArr[i]r )
        {
            r=i+pArr[i];
            c=i;
        }

        res=max( res,pArr[i]);
    }
    return res-1;

}


int main()
{
	srand( (unsigned)time(NULL) );
	//vector s={'1','2','2','1'};
	//cout< s=randomstring();
		if( manacher( manacherstring( s ) ) !=  simplehuiwen( manacherstring( s ) ) )
        {
            for(int i=0;i 
 

  

求在字符串最后添加最少字符使之成为一个回文串。

只有扩右边界时能碰到原字符串有边界就停止

//暴力向两边扩
int simplehuiwen(vector vec)
{
    int res=1;
    int len=vec.size();
    for(int i=0; i=0&&i+gap<=len-1 )
        {
            //cout< vec)
{
    //定c为回文中心,r为回文半径的右边界
    int c=-1;
    int r=-1;
    int res=1;
    int veclen=vec.size();
    //记录每个位置能扩到的右边界
    int* pArr=new int[veclen];
    memset( pArr,0,sizeof(pArr) );
    for( int i=0; ii ? min( pArr[2*c-i],r-i ) : 1;

        //每种情况都尝试向外扩
        while( i-pArr[i]>=0&&i+pArr[i]r )
        {
            r=i+pArr[i];
            c=i;
        }

        if( r==veclen )
        {
            return ( 2*c-veclen+1 )/2;
        }

    }

}

  

 

你可能感兴趣的:(manacher算法(求最长子回文))