Intern
/* Duotas simbolių eilutė. Raskite indeksų i ir j porų skaičių (i <= j), tarp kurių nėra pasikartojančių simbolių. Eilutės "aba" atveju atsakymas yra 5: gali būti ASCII [0, 0] ("a") [0, 1] ("ab") [1, 1] ("b") [1, 2] ("ba") [2, 2] ("a") */
sobes.tech AI
Atsakymas iš AI
Sprendžiant užduotį, reikia pereiti per visus eilutės subeilutes ir patikrinti, ar kiekvienoje subeilutėje nėra pasikartojančių simbolių. Efektyviai tai galima padaryti naudojant judančią lango struktūrą su dviem rodyklėmis ir rinkinį, kuris stebi unikalius simbolius.
Pavyzdys Go kalba:
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
}
// Pavyzdys naudojimui:
// s := "aba"
// fmt.Println(countUniqueSubstrings(s)) // Išves 5
Idėja: išplečiame dešinįjį rodyklį j, kol simboliai yra unikalūs, tada judiname kairįjį rodyklį i ir pašaliname simbolius iš rinkinio. Skaičius unikalių subeilutės, prasidedančios nuo i, yra lygus j - i.