Odd/even trick

Insert separator '#' between chars + at ends. Every palindrome becomes odd length. Uniform handling.

Advertisement

Algorithm

int[] manacher(String s) {
  StringBuilder t = new StringBuilder("^#");
  for (char c : s.toCharArray()) t.append(c).append('#');
  t.append('$');
  int n = t.length();
  int[] p = new int[n];
  int c = 0, r = 0;
  for (int i = 1; i < n - 1; i++) {
    if (i < r) p[i] = Math.min(r - i, p[2 * c - i]);
    while (t.charAt(i + p[i] + 1) == t.charAt(i - p[i] - 1)) p[i]++;
    if (i + p[i] > r) { c = i; r = i + p[i]; }
  }
  return p;
}
Advertisement

Retrieval

Longest palindrome: max p[i]. Extract substring using original coordinates.

Applications

Text analysis. Genome symmetry. Palindrome enumeration.