一、背景
1975年,Manacher发明了Manacher算法(马拉车算法),是一个可以在(O(n))的复杂度中返回字符串s中最长回文子串长度的算法。
二、算法过程分析
1.输入转化
回文串分为奇回文与偶回文,例如,('ababa')中字符个数为5且为回文串,所以它是奇回文,而'abba'字符个数为4且为回文串,所以它是偶回文。
显然,奇回文与偶回文很是不一样,比较难处理,所以我们将输入的字符串转换一下,规则如下:
1.在第一个字符前添加一个不常用字符(常用'$'),以此充当边界
2.在最后一个字符后添加一个不常用字符(常用' '),以此充当边界
3.在第一个字符前('$'后),最后一个字符后(' '前)和每两个字符之间添加一个不常用字符(常用'#')
这样以后,上文的'ababa'就会变成'a#b#a#b#a'(边界未标出),'abba'就会变成'a#b#b#a',它们都是奇回文,这样就会更好处理。
2.过程分析
设(F_i)表示以(i)为中点,回文字符串的最大半径长度。
举个例子。令字符串S='abbadcacda'
i | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
(S) | $ | # | a | # | b | # | b | # | a | # | d | # | c | # | a | # | c | # | d | # | a | # |