😷1062 longest repeating substring
https://leetcode.com/problems/longest-repeating-substring/
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;
}
}
实在是不知道怎么评价。。。
我算是发现了,只要答案所在的区间有界且有序,就可以用binary search试出来, 这里可以用binary search是因为substring长度越长就越不可能repeat
同时找是不是有某个长度的substring在repeat没有好办法,只有遍历,取substring,不然就得用rabin karp
这道题代表了隐式binary search的经典形式,直接搜索答案区间,可以看作是一种对暴力枚举的优化
Last updated