最长回文子串

最长回文子串

public class Manacher {

public static int min(int a, int b) {

return a < b ? a : b;

}

public static void manacher(char[] s, int[] p) {

int size = s.length;

p[0] = 1;

int id = 0;

int mx = 1;

for (int i = 1; i < size; i++) {

if (mx > i) {

p[i] = min(p[2 * id - i], mx - i);

} else {

p[i] = 1;

}

for (; (i + p[i] <= size - 1) && (s[i + p[i]] == s[i - p[i]]);) {

p[i]++;

}

if (mx < i + p[i]) {

mx = i + p[i];

id = i;

}

}

}

public static void main(String[] args) {

String str = "ABCCBC";

char[] s = new char[str.length() * 2 + 2];

int[] p = new int[s.length];

s[0] = '$';

for (int i = 0; i < str.length(); i++) {

s[i * 2 + 1] = '#';

s[i * 2 + 2] = str.charAt(i);

}

s[s.length - 1] = '#';

manacher(s, p);

int index = 0;

int max = 0;

for (int i = 0; i < s.length; i++) {

if (p[i] > max) {

index = i;

max = p[i];

}

}

System.out.println("字符串"+str);

System.out.println("最长回文子串的位置为:" + (index - p[index]));

System.out.println("最长回文子串的长度为:" + (max - 1));

System.out.println("最长回文子串为:");

for (int i = index - p[index] + 1; i < index + p[index]; i++) {

if (i % 2 == 0) {

System.out.print(s[i]);

}

}

}

}

输出结果:

字符串ABCCBC

最长回文子串的位置为:2

最长回文子串的长度为:4

最长回文子串为:

BCCB

============================

字符串ABCDCBCDDE

最长回文子串的位置为:2

最长回文子串的长度为:5

最长回文子串为:

BCDCB

你可能感兴趣的:(最长回文子串)