返回

Manacher算法:字符串中的“守护者”,寻找最长回文子串

前端

字符串中的“守护者”:Manacher算法巧寻最长回文子串

在浩瀚的字符串世界中,寻找最长回文子串如同大海捞针。为了破解这道难题,Manacher算法应运而生,它就像一位字符串中的“守护者”,为我们指引着最长的回文子串。

Manacher算法:揭开最长回文子串的神秘面纱

Manacher算法的核心思想是构建一个辅助数组P,其中P[i]代表以第i个字符为中心的回文串的长度。具体步骤如下:

  1. 预处理字符串: 在原字符串两端分别插入特殊字符"#"作为分隔符。
  2. 初始化: 将P[0]和P[1]均设为0。
  3. 中心扩展: 从P[2]开始,依次向右拓展,并不断更新P[i]。
  4. 奇数中心扩展: 对于奇数下标i,以i为中心向左右扩展,直到遇到分隔符或回文长度超过P[i]。
  5. 偶数中心扩展: 对于偶数下标i,将i设为中心,同时镜像地计算i+1的回文长度。
  6. 查找最长回文子串: 遍历P数组,找出最大值对应的回文子串。

Manacher算法:赋予代码灵动的生命力

为了更直观地理解Manacher算法,让我们用代码来赋予它灵动的生命力:

def manacher(string):
  # 预处理字符串
  processed_string = "#" + "#".join(string) + "#"

  # 初始化辅助数组
  P = [0] * len(processed_string)

  # 中心扩展
  center, right = 0, 0
  for i in range(1, len(processed_string)):
    if i < right:
      P[i] = min(right - i, P[2 * center - i])
    while i - P[i] - 1 >= 0 and i + P[i] + 1 < len(processed_string) and processed_string[i - P[i] - 1] == processed_string[i + P[i] + 1]:
      P[i] += 1
    if i + P[i] > right:
      center, right = i, i + P[i]

  # 查找最长回文子串
  max_length, center = 0, 0
  for i in range(1, len(processed_string)):
    if P[i] > max_length:
      max_length = P[i]
      center = i

  # 去除分隔符,得到最长回文子串
  return processed_string[center - max_length:center + max_length + 1].replace("#", "")

结语

Manacher算法以其高效简洁的特性在字符串处理中大放异彩。它为我们提供了寻找最长回文子串的利器,在文本分析、模式匹配等领域有着广泛的应用。作为一位技术博客创作专家,能够运用Manacher算法为读者揭开字符串中的奥秘,让人倍感兴奋!