class Solution {
public int longestRepeatingSubstring(String S) {
int n = S.length();
int left = 0;
int right = n;
int L;
while (left + 1 < right) {
L = left + (right - left) / 2;
if (search(L, n, S) != -1) {
left = L;
} else {
right = L;
}
}
if (search(right, n, S) != -1) {
return right;
}
return left;
}
private int search(int L, int n, String S) {
if (L == 0) {
return 0;
}
Set<String> seen = new HashSet();
String tmp;
for (int start = 0;start < n - L + 1; start++) {
tmp = S.substring(start, start + L);
if (seen.contains(tmp)) return start;
seen.add(tmp);
}
return -1;
}
}