本文在这篇文章的基础上完成。下面说下Mancher算法。
一、Mancher可以解决的问题
看这里,题目的核心意思是求指定字符串的最长回文(自行百度什么是“回文”)子字符串的长度。传统做法我们这里就不讲了,直接讲Macher。
1、字符串转换
回文字符串长度可是奇数,也可是偶数。为了方便处理,我们通过在每个字符之间以及字符首位加特殊符号的方式来统一奇偶问题。举个例子:
S=“abba”,变为T="#a#b#b#a#" 。我们会发现S的长度是4,而T的长度为9,长度变为奇数了。
那S的长度为奇数的情况时,变化后的长度还是奇数吗?
再举个例子:
S=“abcba”,变化为T=“#a#b#c#b#a#”,T的长度为11。
所以我们发现其改造的目的是将字符串的长度变为奇数,这样就可以统一的处理奇偶的情况了。
2、计算新字符串的回文半径
- 创建数组P,P[i]表示以T[i]为中心的回文半径。举个例子