Сложность: medium
Дана строка s. Вернуть длину самой длинной повторяющейся подстроки. Если повторяющаяся подстрока отсутствует, вернуть 0.
Пример:
Input: s = "abcd"
Output: 0
Explanation: There is no repeating substring.
👨💻 Алгоритм:
1⃣Перемещайте скользящее окно длиной L по строке длиной N.
2⃣Проверьте, находится ли строка в скользящем окне в хэш-наборе уже виденных строк. Если да, то повторяющаяся подстрока находится здесь. Если нет, сохраните строку из скользящего окна в хэш-наборе.
3⃣Очевидный недостаток этого подхода — большое потребление памяти в случае длинных строк.
😎 Решение:
class Solution {
public int search(int L, int n, String S) {
HashSet<String> seen = new HashSet<>();
for (int start = 0; start < n - L + 1; ++start) {
String tmp = S.substring(start, start + L);
if (seen.contains(tmp)) return start;
seen.add(tmp);
}
return -1;
}
public int longestRepeatingSubstring(String S) {
int n = S.length();
int left = 1, right = n;
while (left <= right) {
int L = left + (right - left) / 2;
if (search(L, n, S) != -1) {
left = L + 1;
} else {
right = L - 1;
}
}
return left - 1;
}
}Ставь 👍 и забирай 📚 Базу знаний