LeetCode5、最長迴文子串

/**
 * 5、最長迴文子串
 *
 * 給定一個字符串s,找到s中最長的迴文子串。你可以假設s的最大長度爲1000。
 * 示例 1:
 * 輸入: "babad"
 * 輸出: "bab"
 * 注意: "aba" 也是一個有效答案。
 *
 * 示例 2:
 * 輸入: "cbbd"
 * 輸出: "bb"
 */

    /**
     * 解法 1: 暴力破解
     * 暴力求解,列舉所有的子串,判斷是否爲迴文串,保存最長的迴文串。
     */
    public boolean isPalindromic(String s) {
        int len = s.length();
        for (int i = 0; i < len / 2; i++) {
            if (s.charAt(i) != s.charAt(len - i - 1)) {
                return false;
            }
        }
        return true;
    }

    // 暴力解法
    public String longestPalindrome1(String s) {
        if (s.isEmpty()) {
            return s;
        }
        String ans = "";
        int max = 0;
        int len = s.length();
        for (int i = 0; i < len; i++)
            for (int j = i + 1; j <= len; j++) {
                String test = s.substring(i, j);
                if (isPalindromic(test) && test.length() > max) {
                    ans = s.substring(i, j);
                    max = ans.length();
                }
            }
        return ans;
    }

    /**
     *   時間複雜度:兩層for循環O(n²),for循環裏邊判斷是否爲迴文 O(n),所以時間複雜度爲 O(n³)。
     *   空間複雜度:O(1),常數個變量
     */

    /**
     * 解法 2
     * 最簡單直觀的方法是遍歷字符串,遍歷的時候以每個字符爲中心向左右兩側擴散
     * 對於奇數,我們以該字符爲中心向兩邊擴散;對於偶數,我們以該字符和下一個字符作爲中心字符,然後向兩邊擴散。
     */
 
    private int start = 0, maxLen = 0;

    public String longestPalindrome2(String s) {
        if(s.length() < 1)
            return s;

        for(int i=0; i<s.length(); i++){
            // 迴文子串爲奇數時,查找最長迴文子串
            extendPalindrome(s, i, i);
            // 迴文子串爲偶數時,查找最長迴文子串
            extendPalindrome(s, i, i+1);
        }

        return s.substring(start, start + maxLen);
    }

    private void extendPalindrome(String s, int left, int right){
        // 判斷是否爲迴文子串,若是,則左指針向左移動,右指針向右移動
        while(left>=0 && right<s.length() && s.charAt(left) == s.charAt(right)){
            left--;
            right++;
        }

        // 迴文子串查找完成後,判斷剛剛查找的迴文子串是否爲最長迴文子串,若是,則更新起始位置和最長長度
        if(maxLen < right-left-1){
            start = left + 1;
            maxLen = right -left - 1;
        }
    }
    /**
     * 整個算法流程的時間複雜度爲O(n^2),空間複雜度爲O(1)。
     */

更多LeetCode題目解法傳送門

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章