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 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 right pozí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.