Intern
/* Dani je niz znakova. Nađite broj parova indeksa i i j (i <= j), između kojih nema ponovljenih znakova. Za niz "aba" odgovor je 5: mogu biti ASCII [0, 0] ("a") [0, 1] ("ab") [1, 1] ("b") [1, 2] ("ba") [2, 2] ("a") */
sobes.tech AI
Odpoveď od AI
Na vyriešenie úlohy je potrebné prejsť všetky podreťazce reťazca a skontrolovať, či v každom podreťazci nie sú opakujúce sa znaky. Aby sme to efektívne urobili, môžeme použiť posuvné okno so dvoma ukazovateľmi a množinu na sledovanie unikátnych znakov.
Príklad v Go:
func countUniqueSubstrings(s string) int {
n := len(s)
count := 0
chars := make(map[byte]bool)
j := 0
for i := 0; i < n; i++ {
for j < n && !chars[s[j]] {
chars[s[j]] = true
j++
}
count += j - i
delete(chars, s[i])
}
return count
}
// Príklad použitia:
// s := "aba"
// fmt.Println(countUniqueSubstrings(s)) // Vypíše 5
Myšlienka: rozšírime pravý ukazovateľ j, kým sú znaky jedinečné, potom posunieme ľavý ukazovateľ i a odstránime znaky zo súboru. Počet jedinečných podreťazcov začínajúcich na i je rovný j - i.