Sobes.tech
Back to questions
Middle+
4

// Дана строка s. Нужно найти длину самой длинной подстроки без повторяющихся символов. // Примеры: // s = "abcabcbb", ответ: 3 ("abc") // s = "cccccccc", ответ: 1 ("c") // s = "pwwkew", ответ: 3 ("wke") // s = "", ответ: 1 ("") // Строка s состоит из английских букв, цифр, символов и пробелов func lengthOfLongestSubstring(s string) int { return 0 }

Companies where asked
МВидеоМВидео

Answer from AI

sobes.tech AI

Для решения задачи поиска длины самой длинной подстроки без повторяющихся символов можно использовать алгоритм "скользящего окна" (sliding window). Идея в том, чтобы поддерживать два указателя, которые определяют текущую подстроку без повторов, и обновлять максимальную длину по мере продвижения.

Пример реализации на Go:

func lengthOfLongestSubstring(s string) int {
    charIndex := make(map[rune]int) // хранит последний индекс символа
    maxLen := 0
    start := 0

    for i, ch := range s {
        if lastPos, found := charIndex[ch]; found && lastPos >= start {
            start = lastPos + 1
        }
        charIndex[ch] = i
        if i - start + 1 > maxLen {
            maxLen = i - start + 1
        }
    }
    return maxLen
}

Объяснение:

  • start — начало текущего окна без повторяющихся символов.
  • charIndex хранит последний индекс каждого символа.
  • Если встречается повтор символа внутри текущего окна, сдвигаем start за последний индекс этого символа.
  • Обновляем максимальную длину при каждом шаге.

Так алгоритм работает за O(n), где n — длина строки.