Назад к вопросам
Intern
13
func countSubs(s string) int { result := 0 left := 0 hm := make(map[rune]int) n := len(s) for right := 0; right < n; right++ { hm[s[right]]++ for hm[s[right]] > 1 { hm[s[left]]-- if hm[s[left]] == 0 { delete(hm, s[left]) } left++ } result += (right - left + 1) } return result }
Компании, где спрашивали
Яндекс
Ответ от нейросети
sobes.tech AI
Данная функция на Go подсчитывает количество подстрок в строке s, в которых все символы уникальны.
Как это работает:
- Используется скользящее окно с границами
leftиright. - В
hmхранится количество вхождений каждого символа в текущем окне. - При расширении окна вправо увеличиваем счетчик символа.
- Если символ встречается более одного раза, сдвигаем левую границу окна, уменьшая счетчики, пока все символы не станут уникальными.
- Количество уникальных подстрок, заканчивающихся в позиции
right, равно длине текущего окна(right - left + 1). - Суммируем это количество для всех позиций.
Пример:
func countSubs(s string) int {
result := 0
left := 0
hm := make(map[rune]int)
n := len(s)
for right := 0; right < n; right++ {
hm[rune(s[right])]++
for hm[rune(s[right])] > 1 {
hm[rune(s[left])]--
if hm[rune(s[left])] == 0 {
delete(hm, rune(s[left]))
}
left++
}
result += (right - left + 1)
}
return result
}
Таким образом, функция эффективно считает количество подстрок с уникальными символами за время O(n).