/**
* @author: 1298509345
* date: 2020/8/23
* Time: 20:34
* Describe:
*/
public class Main2 {
static char[] manacherStr(String str) {
char[] chars = str.toCharArray();
char[] ret = new char[chars.length * 2 + 1];
int idx = 0;
for (int i = 0; i < ret.length; i++) {
ret[i] = (i & 1) == 0 ? '#' : chars[idx++];
}
return ret;
}
static String lps(String str) {
char[] chars = manacherStr(str);
int[] pRadius = new int[chars.length];
int C = -1, maxR = -1;
int begin = -1, len = 0;
for (int i = 0; i < chars.length; i++) {
pRadius[i] = maxR > i ? Math.min(pRadius[2 * C - i], maxR - i) : 1;
while (i - pRadius[i] >= 0 && i + pRadius[i] < chars.length) {
if (chars[i - pRadius[i]] == chars[i + pRadius[i]]) pRadius[i]++;
else break;
}
if (i + pRadius[i] > maxR) {
C = i;
maxR = i + pRadius[i];
}
if (pRadius[i] > len) {
begin = i - (pRadius[i] - 1);
len = pRadius[i] - 1;
}
}
return begin == -1 ? "" : new String(chars).substring(begin, begin + 2 * len).replaceAll("#", "");
}
public static void main(String[] args) throws IOException {
String str1 = "babad";
System.out.println(lps(str1));
}
}
Manacher算法简单实现
最新推荐文章于 2023-08-08 23:19:26 发布