Sobes.tech
Назад к вопросам
Intern
7

func countSubs(s string) int { result := 0 left := 0 hm := make(map[rune]int) for right := 0; right < len(s); 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

Функция countSubs подсчитывает количество подстрок в строке s, в которых все символы уникальны.

Алгоритм использует метод "скользящего окна" с двумя указателями left и right. Словарь hm хранит количество вхождений каждого символа в текущем окне.

  • При расширении окна вправо увеличиваем счетчик символа.
  • Если символ встречается более одного раза, сдвигаем левый указатель, уменьшая счетчики, пока повтор не исчезнет.
  • Количество уникальных подстрок, заканчивающихся на позиции right, равно длине текущего окна (right - left + 1).
  • Суммируем это значение для всех позиций.

Пример использования:

total := countSubs("abc") // total = 6, подстроки: "a", "b", "c", "ab", "bc", "abc"

Таким образом, функция эффективно считает количество подстрок без повторяющихся символов за O(n).