zoukankan      html  css  js  c++  java
  • PAT甲题题解-1040. Longest Symmetric String (25)-求最长回文子串

    博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~
    http://www.cnblogs.com/chenxiwenruo/p/6789177.html
    特别不喜欢那些随便转载别人的原创文章又不给出链接的
    所以不准偷偷复制博主的博客噢~~

    给出一个字符串,让你找出其中最长的回文子串的长度
    因为长度最多1000,其实暴力枚举也可以
    对于第i个字符,往前、往右找,统计能够达到的最大回文长度,for一遍即可
    然而如果对应大数据就不行了,所以这里还是用了
    Manacher算法 O(n) 求最长回文子串
    不会的还是建议戳一下链接学习一下

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <string.h>
    #include <cmath>
    using namespace std;
    const int M = 1005*2;
    char str[M];//start from index 1
    int p[M];
    char s[M];
    int n;
    void checkmax(int &ans,int b){
        if(b>ans) ans=b;
    }
    inline int min(int a,int b){
        return a<b?a:b;
    }
    void pk(){
        int i;
        int mx = 0;
        int id;
        for(i=1; i<n; i++){
            if( mx > i )
                p[i] = min( p[2*id-i], p[id]+id-i );
            else
                p[i] = 1;
            for(; str[i+p[i]] == str[i-p[i]]; p[i]++) ;
            if( p[i] + i > mx ) {
                mx = p[i] + i;
                id = i;
            }
        }
    }
    void pre()
    {
        int i,j,k;
        n = strlen(s);
        str[0] = '$';
        str[1] = '#';
        for(i=0;i<n;i++)
        {
            str[i*2 + 2] = s[i];
            str[i*2 + 3] = '#';
        }
        n = n*2 + 2;
        str[n] = 0;
    }
    
    void pt()
    {
        int i;
        int ans = 0;
        for(i=0;i<n;i++)
            ans=max(ans,p[i]);
        printf("%d
    ", ans-1);
    }
    
    int main()
    {
        gets(s);
    //printf("%s
    ",s);
        pre();
        pk();
        pt();
        return 0;
    }
    View Code
  • 相关阅读:
    hdu 5961 传递(暴力搜索)
    hdu 3577 Fast Arrangement(线段树区间修改,求区间最小值)
    hdu 5898 odd-even number(数位dp)
    Python-编码
    Golang-教程
    Python-待
    Python_每日习题_0006_斐波那契数列
    计算机网络
    Python_老男孩练习题1
    Python_内置函数2_44
  • 原文地址:https://www.cnblogs.com/chenxiwenruo/p/6789177.html
Copyright © 2011-2022 走看看