Intern
/* Adott egy karakterlánc. Határozd meg az i és j indexpárok számát (i <= j), amelyek között nincsenek ismétlődő karakterek. A "aba" karakterlánc esetén a válasz 5: lehet ASCII [0, 0] ("a") [0, 1] ("ab") [1, 1] ("b") [1, 2] ("ba") [2, 2] ("a") */
sobes.tech MI
Válasz az MI-től
A probléma megoldásához végig kell menni a sztring összes al-sztringjén, és ellenőrizni kell, hogy minden al-sztringben nincsenek-e ismétlődő karakterek. Hatékonyabbá tehető egy két mutatóval rendelkező mozgó ablak és egy halmaz használatával, amely nyomon követi az egyedi karaktereket.
Példa Go nyelven:
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
}
// Használati példa:
// s := "aba"
// fmt.Println(countUniqueSubstrings(s)) // 5-öt ír ki
Ötlet: a jobb mutatót j bővítjük, amíg a karakterek egyediek, majd a bal mutatót i mozgatjuk, és eltávolítjuk a karaktereket a halmazból. Az i-vel kezdődő egyedi al-sztringek száma megegyezik j - i-vel.