Middle+
// Даден е низът s. Трябва да намерим дължината на най-дългия подниз без повтарящи се символи. // Примери: // s = "abcabcbb", отговор: 3 ("abc") // s = "cccccccc", отговор: 1 ("c") // s = "pwwkew", отговор: 3 ("wke") // s = "", отговор: 0 ("") // Низът s се състои от английски букви, цифри, символи и интервали func lengthOfLongestSubstring(s string) int { return 0 }
sobes.tech AI
Отговор от 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 — длина строки.