需要用的变量1:每一个位置的最长回文半径
需要用的变量2:之前扩的所有位置中,所能到达的最右 回文右边界
需要用的变量3:取得最远右边界时候中心点的位置
一、思路
(一)将数组每个位置中间加上#,这样可以判断偶数长度字符串的回文
(二)先设置一个数组,记录每个位置的回文半径
1.情况1,当前位置i没有在变量2里面。直接暴力往左边两边找最大回文串
2.情况2,当前位置i在变量2内部,则变量3一定也在i左边,当前位置i对变量3做对称。L是变量3的左边界,如图情况:
再根据情况2.中i的回文情况再分为以下几种情况:
(1)i’的回文半径在L到R内部(情况入下图所示),那么i的半径就和i’半径一样
(2)i’的回文半径在LR外部,那么i的回文半径就是i到R这一段。
(3)i’的回文半径左侧正好在L位置上,i的半径长度未知,得继续向右扩才能找到最大半径。
二、伪代码
三、java代码
public String preProcess(String s) {
int n = s.length();
if (n == 0) {
return "^$";
}
String ret =