51nod 1088 最长回文子串

来源:互联网 发布:mac安装什么虚拟机 编辑:程序博客网 时间:2024/05/18 01:58

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


马拉车算法


#include<iostream>using namespace std;#include<string>#define min(x, y) ((x)<(y)?(x):(y))#define max(x, y) ((x)<(y)?(y):(x))string findLongestPalindrome3(string s){    int length=s.size();    for(int i=0,k=1;i<length-1;i++)//给字符串添加 #    {        s.insert(k,"#");        k=k+2;    }    length=length*2-1;//添加#后字符串长度    int *rad=new int[length]();    rad[0]=0;    for(int i=1,j=1,k;i<length;i=i+k)    {        while(i-j>=0&&i+j<length&&s.at(i-j)==s.at(i+j))            j++;        rad[i]=j-1;        for(k=1;k<=rad[i]&&rad[i-k]!=rad[i]-k;k++)//镜像,遇到rad[i-k]=rad[i]-k停止,这时不用从j=1开始比较            rad[i+k]=min(rad[i-k],rad[i]-k);        j=max(j-k,0);//更新j    }    int max=0;    int center;    for(int i=0;i<length;i++)    {        if(rad[i]>max)        {            max=rad[i];            center=i;        }    }    return s.substr(center-max,2*max+1);}int main(){    string str;    cin>>str;    str=findLongestPalindrome3(str);    int cnt=0;    for(int i=0;i<str.length();i++)    {        if(str[i]!='#')            cnt++;    }    cout<<cnt<<endl;    return 0;}











原创粉丝点击