Sobes.tech
Intern

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

Отговор от AI

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

Алгоритъмът използва метода "плъзгащо се окно" с два указателя left и right. Речникът hm съхранява броя на срещанията на всеки символ в текущото окно.

  • При разширяване на прозореца надясно увеличаваме брояча на символа.
  • Ако символът се среща повече от веднъж, преместете левия указател, намалявайки броячите, докато повторението изчезне.
  • Броят на уникалните поднизове, които завършват на позиция right, е равен на дължината на текущото окно (right - left + 1).
  • Тази стойност се сумира за всички позиции.

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

total := countSubs("abc") // total = 6, поднизове: "a", "b", "c", "ab", "bc", "abc"

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