Sobes.tech
Intern

/* Une chaîne de caractères est donnée. Trouver le nombre de paires d'indices i et j (i <= j), entre lesquelles il n'y a pas de caractères répétés. Pour la chaîne "aba", la réponse est 5 : peuvent être ASCII [0, 0] ("a") [0, 1] ("ab") [1, 1] ("b") [1, 2] ("ba") [2, 2] ("a") */

sobes.tech IA

Réponse de l'IA

Pour résoudre le problème, il faut parcourir toutes les sous-chaînes de la chaîne et vérifier qu'il n'y a pas de caractères répétés dans chaque sous-chaîne. Pour le faire efficacement, on peut utiliser une fenêtre glissante avec deux pointeurs et un ensemble pour suivre les caractères uniques.

Exemple en 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
}

// Exemple d'utilisation:
// s := "aba"
// fmt.Println(countUniqueSubstrings(s)) // Affiche 5

Idée : on étend le pointeur droit j tant que les caractères sont uniques, puis on déplace le pointeur gauche i, en supprimant les caractères de l'ensemble. Le nombre de sous-chaînes uniques commençant par i est égal à j - i.