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 MI
Válasz az MI-től
A countSubs függvény megszámolja az s sztringben található olyan alkönyvtárak számát, amelyekben minden karakter egyedi.
Az algoritmus a "csúszó ablak" módszert használja két mutatóval, left és right. A hm szótár tárolja az aktuális ablakban lévő karakterek előfordulási számát.
- Az ablak jobb oldalának bővítésekor növeljük a karakter számlálóját.
- Ha egy karakter többször is előfordul, akkor a bal mutatót mozgatjuk, csökkentve a számlálókat, amíg a ismétlődés el nem tűnik.
- A
rightpozícióban végződő egyedi alkönyvtárak száma megegyezik az aktuális ablak hosszával(right - left + 1). - Ezt az értéket összeadjuk minden pozícióra.
Használati példa:
total := countSubs("abc") // total = 6, alkönyvtárak: "a", "b", "c", "ab", "bc", "abc"
Így a függvény hatékonyan számolja az ismétlődő karakter nélküli alkönyvtárak számát O(n) időben.