zoukankan      html  css  js  c++  java
  • 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);
        }
    };
  • 相关阅读:
    c++ cout、cin、endl
    c++ namespace
    找到小镇的法官
    整数反转
    c++stack类的用法
    栈应用:最小栈(第二题)
    栈的压入、弹出序列(第一题)
    c++中vector类的用法
    Android 面试常问七道题
    传感器实现仿微信摇一摇功能
  • 原文地址:https://www.cnblogs.com/zywscq/p/4895310.html
Copyright © 2011-2022 走看看