Given a string S, find out the length of the longest repeating substring(s). Return 0 if no repeating substring exists.
Example 1:
Input: "abcd"
Output: 0
Explanation: There is no repeating substring.
Example 2:
Input: "abbaba"
Output: 2
Explanation: The longest repeating substrings are "ab" and "ba", each of which occurs twice.
Example 3:
Input: "aabcaabdaab"
Output: 3
Explanation: The longest repeating substring is "aab", which occurs 3 times.
Example 4:
Input: "aaaaa"
Output: 4
Explanation: The longest repeating substring is "aaaa", which occurs twice.
Note:
The string S consists of only lowercase English letters from 'a' - 'z'.
1 <= S.length <= 1500
代码
Approach #1 Binary Search + HashSet
classSolution {publicintlongestRepeatingSubstring(String S) {int n =S.length();int left =1;int right = n;int L;while (left <= right) { L = left + (right - left) /2;if (search(L, n, S)==-1) { right = L -1; } else { left = L +1; } } return left -1; }privateintsearch(int L,int n,String S) {HashSet<String> seen =newHashSet();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; }}