1. 程式人生 > 其它 >演算法38 5. 最長迴文子串

演算法38 5. 最長迴文子串

leetcode的提交不知道是不是有問題,我寫的在本地跑起來比官方答案快,但是提交失敗。

我的思路

正推,字串首尾各放一指標,向中間查詢相同項,找到後開始判斷是否迴文串,當兩指標相遇判斷結果,記錄長度。並且第一個找到的迴文串肯定是最大,所以前面的指標向前繼續查詢

string longestPalindrome(string s) {
        int p,max;
        p=0;//標記最長子串的指標
        max=1;//記錄最大值
        for(int i=0;i<s.size()-1;i++){
            for(int j=s.size()-1;j>i;j--){
                bool q=0;//當找到迴文串結束j迴圈

                if(s[i]==s[j]){//找到迴文串邊界,開始判斷
                    for(int y=i,z=j;z>=y;y++,z--){
                        if(s[y]!=s[z]) break;
                        if(y==z||y==z-1)//結束判斷,記錄大小
                            if(j-i+1>max){ 
                                p=i;
                                max=j-i+1;
                                q=1;
                            }   
                    }

                }
                if(q) j=i;//找到迴文串
            }
        }
        return s.substr(p,max);
    }

中心擴充套件法

class Solution {
public:
    string longestPalindrome(string s) {
        int len=s.size();
        if(len==0||len==1)
            return s;
        int start=0;//記錄迴文子串起始位置
        int end=0;//記錄迴文子串終止位置
        int mlen=0;//記錄最大回文子串的長度
        for(int i=0;i<len;i++)
        {
            int len1=expendaroundcenter(s,i,i);//一個元素為中心
            int len2=expendaroundcenter(s,i,i+1);//兩個元素為中心
            mlen=max(max(len1,len2),mlen);
            if(mlen>end-start+1)
            {
                start=i-(mlen-1)/2;
                end=i+mlen/2;
            }
        }
        return s.substr(start,mlen);
        //該函式的意思是獲取從start開始長度為mlen長度的字串
    }
private:
    int expendaroundcenter(string s,int left,int right)
    //計算以left和right為中心的迴文串長度
    {
        int L=left;
        int R=right;
        while(L>=0 && R<s.length() && s[R]==s[L])
        {
            L--;
            R++;
        }
        return R-L-1;
    }
};