Javaの算術演習 - 最長の回文構造部分文字列

トピックリンク

タイトル説明

文字列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アルゴリズム、および補足上の他のフォローアップ研究です。

付属の

網易クラウド - 「放蕩息子」

上記

おすすめ

転載: www.cnblogs.com/mxwbq/p/10938952.html
おすすめ