Intern
/* Antud on tähemärkide rida. Leidke indeksite i ja j paare arv (i <= j), mille vahel ei ole korduvaid tähemärke. Rida "aba" puhul on vastus 5: võivad olla ASCII [0, 0] ("a") [0, 1] ("ab") [1, 1] ("b") [1, 2] ("ba") [2, 2] ("a") */
sobes.tech AI
Vastus AI-lt
Probleemi lahendamiseks tuleb läbi käia kõik stringi alamstringid ja kontrollida, et igas alamstringis ei oleks korduvaid märke. Selle tõhusaks tegemiseks saab kasutada kahte näitajat ja liikuva akna ning kogumit, mis jälgib unikaalseid märke.
Näide Go keeles:
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
}
// Kasutamise näide:
// s := "aba"
// fmt.Println(countUniqueSubstrings(s)) // Väljund 5
Idee: laiendame parempoolset näitajat j, kuni märgid on unikaalsed, siis liigume vasakpoolset näitajat i ja eemaldame märgid kogumist. Unikaalsete alamstringide arv, mis algavad i-st, on võrdne j - i.