leetcode 5 Longest Palindromic Substring(Manacher算法求最长回文串)

应用一下manacher算法就可以O(n)求出结果了。可以参考hdu3068

substr(start,length)函数是这样用的:

substr 方法
返回一个从指定位置开始,并具有指定长度的子字符串。
参数
start
必选。所需的子字符串的起始位置。字符串中第一个字符的索引为 0。
length
可选项。返回的子字符串中包含的字符数。
备注
如果 length 为 0 或负数,将返回一个空字符串。如果没有指定该参数,则子字符串将延续到字符串的结尾。
class Solution {
public:
    int min(int a,int b){
        return a<b?a:b;
    }
    string longestPalindrome(string s) {
        int len=s.length();
        int p[len<<1|1];
        memset(p,0,sizeof(p));
        string st;
        for(int i=0;i<len;i++){
            st+='#'+s.substr(i,1);
        }
        st+='#';
        //cout<<st<<endl;
        len=len*2+1;
        int wid=0,id=0,Max=0,ans=0;
        for(int i=1;i<len;i++){
            if(i<wid){
                p[i]=min(p[2*id-i],wid-i);
            }
            else p[i]=1;
            for(;i-p[i]>=0&&st[i+p[i]]==st[i-p[i]];p[i]++);
            //cout<<p[i]<<endl;
            if(i+p[i]>wid){
                wid=i+p[i];
                id=i;
            }
            if(p[i]-1>Max){
                ans=i;
                Max=p[i]-1;
            }
        }
        //cout<<ans<<' '<<Max<<endl;
        return s.substr((ans-Max)/2,Max);
    }
};
原文地址:https://www.cnblogs.com/zywscq/p/4895310.html