-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmanachersLPS.java
69 lines (53 loc) · 1.76 KB
/
manachersLPS.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
import java.util.Scanner;
class manachersLPS {
private static String dollarify(String text) {
StringBuilder sb = new StringBuilder();
sb.append('$');
for (int i = 0; i < text.length(); i++) {
sb.append(text.charAt(i));
sb.append('$');
}
return sb.toString();
}
private static String manachers(String text) {
String dollaredText = dollarify(text);
int N = dollaredText.length();
if (N == 0) {
return "";
}
int right = 0;
int center = 0;
int bestCenter = 0;
int lengths[] = new int[N];
for (int i = 0; i < N; i++) {
int imirror = center - (i - center);
if (i < right) {
lengths[i] = Math.min(right - i, lengths[imirror]);
}
int l = i - lengths[i] - 1;
int r = i + lengths[i] + 1;
while (l >= 0 && r < N && dollaredText.charAt(l) == dollaredText.charAt(r)) {
lengths[i]++;
l--;
r++;
}
if (i + lengths[i] > right) {
right = i + lengths[i];
center = i;
}
if (lengths[i] > lengths[bestCenter]) {
bestCenter = i;
}
}
int start = (bestCenter - lengths[bestCenter]) / 2;
String answer = text.substring(start, start + lengths[bestCenter]);
return answer;
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.print("Enter the string to search for pallindromes in (in a single line): ");
String text = in.nextLine();
System.out.println(manachers(text));
in.close();
}
}