Intern
/* Dodaný je reťazec znakov. Nájdite počet párov indexov i a j (i <= j), medzi ktorými nie sú opakujúce sa znaky. Pre reťazec "aba" je odpoveď 5: môžu to byť nielen 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é spočítať počet podreťazcov reťazca, v ktorých sú všetky znaky unikátne (bez opakovania).
Prístup s dvoma ukazovateľmi (dvomi oknami):
- Používame dva indexy:
startaend, ktoré označujú hranice aktuálneho okna. - Rozširujeme
endpridávaním znakov, kým nenarazíme na opakovanie. - Ak sa opakovanie objaví, posunieme
startdoprava a odstraňujeme znaky z aktuálneho okna, kým opakovanie nezmizne. - Pre každé umiestnenie
endje počet nových podreťazcov s unikátnymi znakmi rovný dĺžke aktuálneho okna.
Príklad v Go:
func countUniqueSubstrings(s string) int {
count := 0
charIndex := make(map[rune]int)
start := 0
runes := []rune(s)
for end, ch := range runes {
if prev, found := charIndex[ch]; found && prev >= start {
start = prev + 1
}
charIndex[ch] = end
count += end - start + 1
}
return count
}
// Príklad použitia:
// s := "aba"
// fmt.Println(countUniqueSubstrings(s)) // Vypíše 5
Tu počítame počet podreťazcov s unikátnymi znakmi, čo zodpovedá počtu párov indexov i, j, kde podreťazec s[i..j] neobsahuje opakovania.