Сложность: hard
Учитывая строку s, рассмотрите все дублированные подстроки: (смежные) подстроки s, которые встречаются 2 или более раз.Вхождения могут перекрываться. Верните любую дублированную подстроку, которая имеет наибольшую возможную длину.Если в s нет дублирующейся подстроки, ответом будет "".
Пример:
Input: s = "banana"
Output: "ana"
👨💻 Алгоритм:
1⃣Использование двоичного поиска для определения длины дублированной подстроки:
Двоичный поиск используется для поиска максимальной длины дублированной подстроки.
2⃣Использование хеширования для проверки наличия дублированной подстроки определенной длины:
Для каждой длины, определенной двоичным поиском, используем хеширование для поиска подстрок.
3⃣Хеширование с помощью функции rolling hash:
Rolling hash позволяет быстро вычислять хеши подстрок фиксированной длины и сравнивать их для поиска дубликатов.
😎 Решение:
string longestDupSubstring(string s) {
auto search = [&](int length) {
unordered_set<string> seen;
for (int i = 0; i <= s.size() - length; ++i) {
string sub = s.substr(i, length);
if (seen.count(sub)) {
return sub;
}
seen.insert(sub);
}
return string("");
};
int left = 1, right = s.size();
string result = "";
while (left < right) {
int mid = left + (right - left) / 2;
string dup = search(mid);
if (!dup.empty()) {
result = dup;
left = mid + 1;
} else {
right = mid;
}
}
return result;
}Ставь 👍 и забирай 📚 Базу знаний