Используйте скользящее окно и последние позиции символов. При повторе сдвигайте левую границу за предыдущее вхождение, не двигая её назад.
Наибольшая длина непрерывного фрагмента без повторяющихся символов
Используйте скользящее окно и последние позиции символов. При повторе сдвигайте левую границу за предыдущее вхождение, не двигая её назад.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Дано строковое значение. Требуется вычислить максимальную длину подстроки, в которой все символы уникальны.
// Вход: "abcabcbb"
// Выход: 3 // подстрока "abc"
Ответ
Используйте скользящее окно и последние позиции символов. При повторе сдвигайте левую границу за предыдущее вхождение, не двигая её назад.
Вариант Go, считающий Unicode-кодовые точки, а не байты:
func longestUnique(s string) int {
last := make(map[rune]int)
left, best, position := 0, 0, 0
for _, ch := range s {
if previous, ok := last[ch]; ok && previous >= left {
left = previous + 1
}
last[ch] = position
if length := position-left+1; length > best { best = length }
position++
}
return best
}
Для abcabcbb результат 3, для пустой строки 0. Среднее время O(n), память O(числа разных символов). Графемы с комбинируемыми знаками требуют отдельной сегментации; вход предполагается корректным UTF-8.