最長回文子串
一個字元串的回文子串是指一個子字元串,它從中間向兩邊看都是一樣的,也就是說,如果將字元串反轉後,它與原字元串相同。例如,在字元串 "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 值。