Sobes.tech
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: start a end, ktoré označujú hranice aktuálneho okna.
  • Rozširujeme end pridávaním znakov, kým nenarazíme na opakovanie.
  • Ak sa opakovanie objaví, posunieme start doprava a odstraňujeme znaky z aktuálneho okna, kým opakovanie nezmizne.
  • Pre každé umiestnenie end je 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.