Middle+
// Verilen s dizisi. Tekrarlayan karakterler olmadan en uzun alt dizinin uzunluğunu bulmamız gerekiyor. // Örnekler: // s = "abcabcbb", cevap: 3 ("abc") // s = "cccccccc", cevap: 1 ("c") // s = "pwwkew", cevap: 3 ("wke") // s = "", cevap: 0 ("") // s dizisi İngiliz harfleri, rakamlar, semboller ve boşluklardan oluşur func lengthOfLongestSubstring(s string) int { return 0 }
sobes.tech yapay zeka
AI'dan gelen yanıt
Для решения задачи поиска длины самой длинной подстроки без повторяющихся символов можно использовать алгоритм "скользящего окна" (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 — длина строки.