LEECODE 5 求最長迴文子串

晦若晨曦發表於2017-12-14

閒來無事,刷題玩耍~

題目如下: 求最長迴文子串

Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring.

大意就是給你一個字串,求其中最長的迴文字串,最大長度1000.

王老菊說遇事不決莽一波 第一次上的演算法是暴力求解,時間複雜度n^3,不出所料的超時了~

以下是AC的演算法:

根據迴文串的特點,在中軸兩側對應位置的字元應當相等。

將一個位置pos作為中軸,遍歷兩側的字元,直到不相等或超出範圍為止,即可求得以此pos為中軸的最長迴文串。

以上情況僅適用於迴文串的字元為奇數時,存在中軸字元。當迴文串的字元數為偶數時,將pos和pos+1同時作為中軸,向兩側擴充套件遍歷即可。

演算法的時間複雜度為o(n^2),提交AC

程式碼如下,詳見註釋:

package leecode;

/**
 * 最長迴文字串
 * Created by shizhida on 16/4/21.
 */
public class P5_Longest_Palindromic {

    /**
     * 求最長迴文字串
     * @param str
     * @return
     */
    public static String longestPalindromic(String str){

        int maxlength = 0;
        int lpos = 0,rpos = 0;

        for(int i=0;i<str.length();i++){
            //假設為奇
            int len1 = searchAround(str,i,0);
            //假設為偶
            int len2 = searchAround(str,i,1);
            if(len1>maxlength)
            {
                maxlength = len1;
                lpos = i-len1/2;
                rpos = i+len1/2+1;
            }
            if(len2>maxlength)
            {
                maxlength = len2;
                lpos = i-len2/2+1;
                rpos = i+len2/2+1;
            }

        }
        System.out.println(maxlength);
        return str.substring(lpos,rpos);

//        return maxlength;
    }

    /**
     * 從中心點開始校驗左右
     * @param str
     * @param pos
     * @param sub
     * @return
     */
    public static int searchAround(String str,int pos,int sub){

        int l = 0,//左側延伸
                r = 0+sub,//右側延伸
                length=0;//最終長度

        while(pos-l>=0&&pos+r<str.length()&&//超出範圍
                str.charAt(pos-l)==str.charAt(pos+r)//兩側不等
                ){
            length = r+l;//長度為左+右+差值
            //同步擴大範圍
            l++;
            r++;

        }
        return length+1;//會漏掉中間一個(奇)或少算旁邊一個(偶),所以都要+1
    }

}
複製程式碼

相關文章