5, 最長回文子串

題目來源:力扣(LeetCode)
題目鏈接:https://leetcode-cn.com/problems/longest-palindromic-substring

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

示例 1:

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

示例 2:

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

Manachers算法

  • Python
class Solution:
    def longestPalindrome(self, s: str) -> str:
        if s is None or len(s) == 0 or len(s) == 1:
            return s

        temp = handle_arg(s)
        length = len(temp)
        center = 0
        right = 0
        arr = [0] * length

        max_length = 0
        max_index = 0

        for i in range(1, length - 1):
            j = 0
            if i <= right:
                j = min(right - i, arr[2 * center - i])

            while temp[i - j - 1] == temp[i + j + 1]:
                j += 1

            if i + j > right:
                center = i
                right = i + j

            arr[i] = j
            if j > max_length:
                max_length = j
                max_index = i

        left_index = (max_index - max_length) // 2
        return s[left_index: left_index + max_length]


def handle_arg(s: str):
    result = '^'
    for item in s:
        result += '#' + item
    result += '#$'
    return result
  • Go
func longestPalindrome(s string) string {
    temp := handleArg(s)
    length := len(temp)
    center := 0
    right := 0

    arr := make([]int, length)

    maxLength := 0
    maxIndex := 0

    for i := 1; i < length-1; i++ {
        j := 0
        if i <= right {
            j = min(right-i, arr[2*center-i])
        }

        for temp[i-j-1] == temp[i+j+1] {
            j++
        }

        if i+j > right {
            center = i
            right = i + j
        }

        arr[i] = j
        if j > maxLength {
            maxIndex = i
            maxLength = j
        }
    }

    leftIndex := (maxIndex - maxLength) / 2
    return s[leftIndex : leftIndex+maxLength]
}

func handleArg(s string) string {
    var result bytes.Buffer
    result.WriteString("^")
    for _, i := range s {
        result.WriteString("#")
        result.WriteString(string(i))
    }
    result.WriteString("#$")
    return result.String()
}

func min(x, y int) int {
    if x < y {
        return x
    }
    return y
}
  • Java
class Solution {
    public String longestPalindrome(String s) {
        if (s == null || s.length() == 0 || s.length() == 1) {
            return s;
        }

        String temp = handleArg(s);
        char[] chars = temp.toCharArray();
        int length = chars.length;
        int center = 0, right = 0;
        int[] arr = new int[length];

        int maxLength = 0;
        int maxIndex = 0;

        for (int i = 1; i < length - 1; i++) {
            int j;
            if (i <= right) {
                j = Math.min(right - i, arr[2 * center - i]);
            } else {
                j = 0;
            }

            while (chars[i - 1 - j] == chars[i + 1 + j]) {
                j++;
            }

            if (i + j > right) {
                center = i;
                right = i + j;
            }

            arr[i] = j;
            if (j > maxLength) {
                maxLength = j;
                maxIndex = i;
            }
        }

        int leftIndex = (maxIndex - maxLength) / 2;
        return s.substring(leftIndex, leftIndex + maxLength);
    }

    private String handleArg(String s) {
        StringBuilder result = new StringBuilder("^");
        for (int i = 0; i < s.length(); i++) {
            result.append("#").append(s.charAt(i));
        }
        return result.append("#&").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ù)。

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