• 51nod 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;
    }
    











  • 相关阅读:
    浅析值类型与引用类型的内存分配[转载]
    C#引用类型参数,ref按引用传值
    java调用WebService的例子
    poj 2727 Expectation
    IT O
    Android_notepadz
    tomcat mysql 数据源
    android_snakez
    Tomcat下配置ssl
    Android_Hello Worldz
  • 原文地址:https://www.cnblogs.com/bryce1010/p/9387131.html
Copyright © 2020-2023  润新知