LeetCode練手系列——最長回文子串

題目:最長回文子串

給定一個字符串 s,找到 s 中最長的回文子串。你可以假設(shè) s 的最大長度為1000。

示例 1:

輸入: "babad"

輸出: "bab"

注意: "aba"也是一個有效答案。

示例 2:

輸入: "cbbd"

輸出: "bb"

思路和簡單分析: 這道題剛開始沒啥思路,本來打算暴力膜一波,但是感覺肯定無法通過... 看了網(wǎng)上很多解法都用了Manacher算法,能夠在O(n)的情況找出最長的回文子串,雖然還看得不是很明白,但是跟著大概的思路能夠AC,以后如果有時間會對代碼做出優(yōu)化。

思路比較簡單,只需要遍歷一遍數(shù)組,記錄它能夠組成回文字符串的半徑,記錄在數(shù)組p中。使用Manacher算法的思路避免奇數(shù)長和偶數(shù)長字符串的不同邏輯處理,使用不會在字符串中出現(xiàn)的字符做為分隔符對字符數(shù)組擴(kuò)容。

上代碼:

    public String longestPalindrome(String s) {
        char[] c = s.toCharArray();
        
        //分隔字符
        StringBuffer sb = new StringBuffer();
        sb.append("#");
        for (int i = 0;i<c.length;i++){
            sb.append(c[i]);
            sb.append("#");
        }

        int[] p = new int[sb.length()];
        int max = 0;
        int id = 0;
        
        //計算回文串長度
        for(int i = 0;i<sb.length();i++){

            int count = 1;
            p[i] = 1;
            while (i-count>=0  && i+count<sb.length() && sb.charAt(i-count)==sb.charAt(i+count)){
                p[i]++;
                count++;
            }

            if(p[i]>max){
                max = p[i];
                id = i;
            }
        }

        int r = max-1;
        int start = id-r;
        int end = id+r;

        StringBuffer res = new StringBuffer();
        
        //拼接最長回文串
        for (int i = start;i<=end;i++){
            if (sb.charAt(i)!='#'){
                res.append(sb.charAt(i));
            }
        }

        return res.toString();
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容