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).