对策字符串的最大长度
题目
输入一个字符串,输出该字符串中对称的子字符串的最大长度。比如输入字符串 “google”,由于该字符串里最长的对称子字符串是“goog”,因此输出 4。
解析
该题目比较直观的解法有:
- 暴力法:遍历所有可能的子串,然后判断子串是否为回文,故总得复杂度为O(n^3)
- 遍历字符串,以当前遍历为中心点,然后向两边扩展,直至扩展到不是回文,总复杂度为O(n^2)
还有后缀树也可以解,不过需要较大的空间,本文使用的是manacher算法:
Manacher最早发现了可以用O(n)的时间复杂度来解决该问题,所以这种方法称之为Manacher算法。
现在以查询字符串”abaab”为例,该算法为了将”aba”和”baab” 奇偶形式统一考虑,做了一个很精妙的预处理:每每两个字符串以及两端都加一个标志符号#,就形成了
“#a#b#a#a#b#”新字符串,那么”aba”则可以看做”#a#b#a#”,同时”baab”转为#b#a#a#b#”,就都为奇数形式了