Intern
/* Podany jest ciąg znaków. Znajdź liczbę par indeksów i i j (i <= j), pomiędzy którymi nie ma powtarzających się znaków. Dla ciągu "aba" odpowiedź to 5: mogą być ASCII [0, 0] ("a") [0, 1] ("ab") [1, 1] ("b") [1, 2] ("ba") [2, 2] ("a") */
sobes.tech AI
Odpowiedź od AI
Aby rozwiązać problem, należy przejść przez wszystkie podłańcuchy łańcucha i sprawdzić, czy w każdym podłańcuchu nie ma powtarzających się znaków. Aby zrobić to efektywnie, można użyć przesuwnego okna z dwoma wskaźnikami i zbioru do śledzenia unikalnych znaków.
Przykład w Go:
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
}
// Przykład użycia:
// s := "aba"
// fmt.Println(countUniqueSubstrings(s)) // Wypisze 5
Pomysł: rozszerzamy prawy wskaźnik j, dopóki znaki są unikalne, następnie przesuwamy lewy wskaźnik i, usuwając znaki z zestawu. Liczba unikalnych podłańcuchów zaczynających się od i jest równa j - i.