最長回文子串

一個字元串的回文子串是指一個子字元串,它從中間向兩邊看都是一樣的,也就是說,如果將字元串反轉後,它與原字元串相同。例如,在字元串 "abcba" 中,"abcba" 本身和 "bca" 都是回文子串。

要找到一個字元串中最長的回文子串,可以使用曼恩-特拉夫-莫爾(Manacher's)算法,這是一種線性時間算法,用於在字元串中找到最長的回文子串。

下面是一個簡單的Python示例,展示了如何使用Manacher's算法來找到最長回文子串:

def manacher(s):
    # 字元串的長度
    n = len(s)

    # 創建一個輔助數組
    p = [0] * n

    # 初始化中心和半徑
    l = 0
    r = 0

    # 曼acher算法的核心循環
    for i in range(n):
        while (i - l >= 0 and r - i >= i - l):
            p[i] = min(r - i, p[i - l])
            if i + p[i] > r:
                l = i
                r = i + p[i]
            if i >= r - p[i]:
                p[i] = r - i

            # 如果當前位置是回文的,擴展半徑
            if i + p[i] < n - 1 and s[i + p[i] + 1] == s[i - p[i]]:
                p[i] += 1

        # 更新最長的回文子串
        if i + p[i] > r:
            l = i
            r = i + p[i]

    # 返回最長的回文子串的長度
    return r - l

# 示例字元串
s = "abccba"

# 套用算法
longest_palindrome = manacher(s)

# 輸出最長的回文子串的長度
print("The longest palindromic substring is of length", longest_palindrome)

這個算法的時間複雜度是 O(n),空間複雜度也是 O(n),因為我們需要一個大小為 n 的陣列來存儲 p 值。