5. Longest Palindromic Substring

来源:互联网 发布:linux解压缩zip 编辑:程序博客网 时间:2024/06/06 06:33

一开始n^2的写法,超时

class Solution {public:    void init(string s,int& maxn,int &sta)    {        int n=s.size();        vector<vector<bool>> dp(n,vector<bool>(n));        int i,j;        for(i=n-1;i>=0;i--)        {            dp[i][i]=1;            for(j=i+1;j<n;j++)            {                if(s[i]!=s[j])                {                    dp[i][j]=0;                    continue;                }                if(j==i+1)                    dp[i][j]=1;                else                    dp[i][j]=dp[i+1][j-1];                if(dp[i][j]==1&&maxn<j-i+1)                {                    maxn=j-i+1;                    sta=i;                }            }        }    }    string longestPalindrome(string s) {        int n=s.size();        if(n==0)            return s;                int maxn=1;        int i,j;        int sta=0;        init(s,maxn,sta);        return s.substr(sta,maxn);            }};

方法2:采用从中心向两边扩充,也是O(n^2)算法,竟然过了

class Solution {public:    string GetP(string s,int left,int right)    {        int n=s.size();                while(left>=0&&right<n&&s[left]==s[right])        {            left--;            right++;        }        return s.substr(left+1,right-left-1);    }    string longestPalindrome(string s) {        int n=s.size();        int i;        string x,y;        string tmp=s.substr(0,1);        for(i=0;i<n-1;i++)        {            x=GetP(s,i,i);            if(x.size()>tmp.size())                tmp=x;            y=GetP(s,i,i+1);            if(y.size()>tmp.size())                tmp=y;        }        return tmp ;            }};

方法3:

使用mancher算法,复杂度是O(n),

class Solution {public:    string longestPalindrome(string s) {        int n=s.size();        int i;        int mx=0;        if(n==0)            return s;        string str="$";        for(i=0;i<n;i++)        {            str+="#";            str+=s[i];        }        str+="#0";        int len=str.size();        int p[len]={0};        int id=0;        int maxn=0,sta=0;        for(i=1;i<len-1;i++)        {            if(mx>i)                p[i]=min(mx-i,p[2*id-i]);            else                p[i]=1;            while(str[i-p[i]]==str[i+p[i]])                p[i]++;            if(p[i]+i>mx)            {                mx=i+p[i];                id=i;            }            if(maxn<p[i]-1)            {                maxn=p[i]-1;                sta=i;            }        }        string tmp="";        for(i=sta-p[sta]+1;i<sta+p[sta];i++)        {            if(str[i]!='#')                tmp+=str[i];        }        return tmp;    }};


0 0
原创粉丝点击