1.Mancher算法
1.1求回文字串的经典解法
求子串长度,后推广到求最长回文字串长度,例如:abce12130decba,那么最长的回文字串就是121.
求回文长度的经典解法:以每一个字符为对称轴向外扩,但是这样只能求出长度为奇数的回文。经典做法的优化:对于长度为偶数的回文,可以在原字符串之间加入新的字符,这样就能把奇偶长度的都求出来。问:加入的新字符串是否一定要为原字符串中没有出现过的字符?答:不需要,因为比对的时候一直都是新的跟新的比,旧的跟旧的比,不会影响旧的之间是否相等的问题,所以加入的字符可以是随意的字符
1.2回文半径、回文直径、回文半径数组
1.3向右扩最长位置:右边界R,向右扩的中心点C
人为定义R、C一开始为-1
2用manacher解决回文问题
2.1来到一个点,这个点不在最右边界的范围里
直接暴力扩
2.2中心点在最右回文边界的内部
2.2.1当前点i的对称点i'的回文在不在最大回文L-R之间
此时i的回文半径跟i'的是一样的(i'的回文半径之前已经求了放在回文数组中了)
2.2.2当前点i的对称点i'的回文半径超过了L的范围
此时i的回文半径就是i- R的范围
2.2.3当前点i的对称点i'的回文长度刚好跟L重合
此时i到R一定是回文,但是会不会更长就要接着往下试,即判断i点可以直接从R的下一个点开始试
3.manacher伪代码
计算时间复杂度:每个位置扩的时候都失败一次的话,那么时间复杂度就是O(N);如果每一阔,R都会变大,那么此时的时间复杂度也是O(N)。