Back to questions
Intern
6
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 }
Companies where asked
Яндекс
Answer from AI
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).