Sobes.tech
Назад к вопросам
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).