2 votes

Est-il possible de trouver des caractères en double dans une chaîne unicode aléatoire en utilisant les opérations de type bitwise ?

Je cherchais une solution pour trouver les caractères en double dans une chaîne de caractères et j'étais intéressé par une solution avec des opérations par bit.

J'ai trouvé une telle variante avec les opérations bit à bit. Mais dans celle-ci, la recherche se fait dans la plage a-z de la table ASCII.

func HasDuplicates(str string) (string, bool) {
    checker := 0
    for _, char := range str {
        val := char - 'a'
        fmt.Println(val)
        if (checker & (1 << val)) > 0 {
            fmt.Printf("'%c' is Duplicate\n", char)
            return str, false
        }
        checker |= 1 << val
    }
    return str, true
}

Est-il possible de faire une solution universelle, comme l'exemple ci-dessus, mais seulement pour une chaîne unicode aléatoire (hiéroglyphes, emoji, etc.) ?

2voto

samgak Points 52

Utilisez un grand.Int comme un ensemble de bits :

func HasDuplicates(str string) (string, bool) {
    var bits big.Int
    for _, char := range str {
        val := int(char)
        fmt.Println(val)
        if bits.Bit(val) != 0 {
            fmt.Printf("'%c' is Duplicate\n", char)
            return str, false
        }
        bits.SetBit(&bits, val, 1)
    }
    return str, true
}

https://go.dev/play/p/kS-OxYPts5G

L'efficacité de cette opération dépendra de l'implémentation de big.Int, vous n'en avez pas le contrôle comme vous l'avez lorsque vous utilisez des opérations par bit sur un simple entier.

Vous pourriez également utiliser une carte de booléens, mais il ne s'agirait plus alors d'opérations par bit :

func HasDuplicates(str string) (string, bool) {
    var bits = make(map[int]bool)
    for _, char := range str {
        val := int(char)
        fmt.Println(val)
        if bits[val] {
            fmt.Printf("'%c' is Duplicate\n", char)
            return str, false
        }
        bits[val] = true
    }
    return str, true
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X