最长回文串的dp(占空间大,耗时间长,还是马拉车算法,Manacher,好)

#include<iostream>
#include<stdio.h>
#include<string>
#include<vector>
#include<string.h>
using namespace std;


//vector<int> dp[200005];
int  dp[20000][20000];
string si;
char first;
int length=-1,start,endd;
void change()
{
    int zhong=first-'a';

    for(int i=0; i<si.size(); i++)
    {
        if(si[i] - zhong - 'a' >= 0)
        {
            si[i]=si[i]-zhong;
        }
        else
        {
            si[i]=si[i]+26-zhong;
        }
    }

}
void init()
{
    memset(dp,0,sizeof(dp));
    for(int i=0; i<si.size(); i++)
    {
        dp[i][i]=1;

        if( si[i]==si[i+1] && i < si.size()-1 && length>2 )
        {
            dp[i][i+1]=1;
            length=2;
            start=i;
            endd=i+1;
        }
    }


}
int main()
{
    while( cin>>first && cin>>si )
    {

        length=-1;
        change();
        init();
        for(int len=3; len<=si.size(); len++)
        {
            for(int i=0; i+len-1<= si.size()-1; i++)
            {
                int j=i+len-1;
                if(si[i]==si[j])
                {
                    dp[i][i] = dp[i+1][j-1];
                    if(len>length)
                    {
                        length=len;
                        start=i;
                        endd=i+len-1;
                    }

                }
                else
                {
                    dp[i][i]=0;
                }
            }

        }
        if(length==-1)
        cout<<"No solution!"<<endl;
        else
        {
            cout<<start<<" "<<endd<<endl;
            for(;start<=endd;start++)
                cout<<si[start];
            cout<<endl;
        }
    }
    return 0;
}
 

猜你喜欢

转载自blog.csdn.net/while_black/article/details/88918747