Java算法練習——最長回文子串


題目鏈接

題目描述

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

示例 1

輸入: "babad"
輸出: "bab"
注意: "aba" 也是一個有效答案。

示例 2

輸入: "cbbd"
輸出: "bb"

題解(中心擴展算法)

public String longestPalindrome(String string) {
    if (null == string || string.length() < 1) return "";
    int start = 0, end = 0;
    int num1, num2, len;
    for (int i = 0; i < string.length(); i++) {
        num1 = getMaxLength(string, i, i);
        num2 = getMaxLength(string, i, i + 1);
        len = Math.max(num1, num2);
        if (len > end - start) {
            start = i - (len - 1) / 2;
            end = i + len / 2;
        }
    }
    return string.substring(start, end + 1);
}

public int getMaxLength(String s, int left, int right) {
    int L = left, R = right;
    while (L >= 0 && R < s.length() && s.charAt(L) == s.charAt(R)) {
        L--;
        R++;
    }
    return R - L - 1;
}

復雜度分析

  • 時間復雜度:$O(n^2)$,由於圍繞中心來擴展回文會耗去 O(n) 的時間,所以總的復雜度為 :$O(n^2)$

  • 空間復雜度:$O(1)$

手記

中心擴展法相比暴力更理智一些,沒有了盲目的循環,更多是以兩種情況下的分界中心向兩側不斷遞減比較。
還有一個算法復雜度為$O(n)$的Manacher 算法,等后續學習了再補上。

網易雲—《浪子回頭》

以上


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM