Sobes.tech
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.