Наибольшая длина непрерывного фрагмента без повторяющихся символов

Используйте скользящее окно и последние позиции символов. При повторе сдвигайте левую границу за предыдущее вхождение, не двигая её назад.

Короткий ответ

Что ответить на собеседовании

Используйте скользящее окно и последние позиции символов. При повторе сдвигайте левую границу за предыдущее вхождение, не двигая её назад.

Подробный разбор

Ответ с пояснениями

Условие

Дано строковое значение. Требуется вычислить максимальную длину подстроки, в которой все символы уникальны.

// Вход:  "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.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее