Используйте скользящее окно и словарь последних позиций символов. При повторе сдвигайте левую границу за предыдущий экземпляр, не двигая её назад. Сложность — O(n).
Определение максимальной длины подстроки без дублирующихся символов
Используйте скользящее окно и словарь последних позиций символов. При повторе сдвигайте левую границу за предыдущий экземпляр, не двигая её назад. Сложность — O(n).
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Реализуйте функцию, принимающую строку и возвращающую длину самой длинной последовательности символов, в которой нет повторов.
Пример: Вход: "abcabcbb" → Выход: 3 Вход: "bbbbbb" → Выход: 1 Вход: "pwwkew" → Выход: 3
Ответ
Используйте скользящее окно и словарь последних позиций символов. При повторе сдвигайте левую границу за предыдущий экземпляр, не двигая её назад. Сложность — O(n).
Храним только окно без повторов и максимальную найденную длину:
def longest_unique(text):
last = {}
left = best = 0
for right, char in enumerate(text):
left = max(left, last.get(char, -1) + 1)
last[char] = right
best = max(best, right - left + 1)
return best
Для abcabcbb и pwwkew результат 3, для bbbbbb — 1, для пустой строки — 0. Память O(k), где k — число разных символов. Здесь символ означает Unicode code point, а не обязательно целую визуальную графему.