Manacher Algorithm 马拉车算法
在介绍算法前,先了解一下最长回文子串
在计算机科学中,最长回文子串或最长对称因子问题是在一个字符串中查找一个最长连续子串,这个子串必须是回文。例如:
(1) s = “banana” 最长回文子串是“anana”。中间的a为中心,左右对称(或者说镜像)。
(2) s = “abracadabra” 最长回文子串是“ada”和“aca”,长度均为3。
所以最长回文子串并不能保证是唯一的。在一些应用中需要返回全部的最长回文子串(所有子串都是回文,并且不能扩展为更大的回文子串)而不是返回其中之一或是最大的回文子串的长度。
[Manacher(1975)] 发现了一种线性时间算法 O(n) O ( n ) ,可以在列出给定字符串中从字符串头部开始的所有回文。要在线性时间内找出字符串的最长回文子串,这个算法必须利用回文和子回文的这些特点和观察回文的左边是右边的镜像。
算法流程分析
由于回文分为偶回文(比如 abab 长度为4)和奇回文(比如 abcba 长度为5),而在处理奇偶问题比较麻烦,所以这里需要做个预处理,在字符间插入一个特殊字符(这个字符不能在串里出现
),将原串转换统一成奇串。
比如原字符串: s =”abbaTNTabcba”
插入字符之后:sN