1. 程式人生 > 實用技巧 >最長迴文子串

最長迴文子串

題目:最長迴文子串

問題描述:

給定一個字串 s,找到 s 中最長的迴文子串。你可以假設 s 的最大長度為 1000。

解決思路:

本題可以採用中心擴充套件演算法:顧名思義,由於迴文串具有中心對稱的性質,所以我們可以根據字串中的某一個字元開始分別向左向右擴充套件,直到找到不相等的字元為止,這樣得到的字串即是能夠得到的最長迴文串。

我們應該注意,當迴文串的長度是偶數時,中心有n-1個;而當迴文串的長度是奇數時,中心就有n個(n為迴文串的長度):

解決程式碼:


class Solution {
    public static String longestPalindrome(String s) {
        if (s.length() < 2) {
            return s;
        }

        // 最長迴文子串長度
        int maxLen = 0;
        // 迴文子串中心
        int center = 0;
        for (int i = 0; i < s.length(); i++){
            // 最長迴文串長度為奇數
            int begin = centerExpand(s, i, i);
            // 最長迴文串長度為偶數
            int end = centerExpand(s, i, i + 1);

            if (maxLen < Math.max(begin, end)){
                center = i;
                maxLen = Math.max(begin, end);
            }
        }
        // 如果迴文子串的長度為偶數,那麼中心左邊的長度會比右邊的長度小1
        return s.substring(center - (maxLen - 1) / 2, center + maxLen / 2 + 1);
    }

    private static int centerExpand(String s, int begin, int end){
        while (begin >= 0 && end < s.length() && s.charAt(begin) == s.charAt(end)){
            begin--;
            end++;
        }
        // 返回以begin和end為基準,同時向左向右擴充套件後能夠得到的最長迴文串長度
        return end - begin - 1;
    }
}