[vb.net] ClassCombinatoric

ClassCombinatoric, Donne toutes les permutations sans doublons d'une chaine de caractères, le temps traitement et la mémoire exigés dépendent de la longueur de la chaine
Public Class ClassCombinatoric
  
    Private permlist As New List(Of String)
    Public Function GetPerms(ByVal mystring As String) As List(Of String)
        'donne toutes les permutations sans doublons d'une chaine de caractères
        'le temps traitement et la mémoire exigés dependent de la longueur de la chaine
  
        permlist.Add(mystring)
        permutation(mystring)
  
        Dim letters As String = String.Empty
        Dim duplicate As Boolean = False
        For l = 0 To mystring.Count - 1
            If Not letters.Contains(mystring(l)) Then
                letters &= mystring(l)
            Else
                duplicate = True
                Exit For
            End If
        Next
        If duplicate Then
            EraseDuplicateString()
        End If
  
        Return permlist
  
    End Function
    Private Function rotateright(ByVal str As String) As String
        'shift right  of the string parameter:  last characters goes to the first place
        Dim strret As String = String.Empty
        Return str.Substring(str.Length - 1) & str.Substring(0, str.Length - 1)
  
    End Function
  
    Private Sub EraseDuplicateString()
        'remove dupicate strings
        permlist = permlist.Distinct().ToList
  
    End Sub
  
  
    Private Sub permutation(ByVal str As String)
        ' on ajoute le premier string dans le tableau perms
        ' rotation du mot vers la droite et ajoute au tableau perms
        ' on refait l'opération longueur du string -1
        ' on recommence avec tout les strings de perms mais chaque mot commence un caratère
        ' à droite
        'ex  bnok
        ' le mot = bnok
        ' après 3  rotation on a kbno okbn nokb
        ' on reprend la sous chaine nok de bnok
        'après 2 rotations kno okn
        Dim prefix As String = String.Empty
        Dim group As Integer
        Dim str1 As String
        Dim count, pointer, last, permutcounter As Integer
        Dim x As Integer
        group = 0
        pointer = 0
        count = 0
        last = 1
  
        permutcounter = permlist(0).Length - 1
        x = permlist(0).Length
  
        While group <= permlist(0).Length - 2
            prefix = permlist(pointer).Substring(0, group)
            str1 = permlist(pointer).Substring(group)
            For iter As Integer = 0 To permlist(pointer).Length - (2 + group)
                count += 1
                permlist.Add(prefix & rotateright(str1))
                str1 = permlist(count).Substring(group)
            Next
  
            If count + 1 = last + (permutcounter) * last Then
                group += 1
                last = count + 1
                pointer = 0
                permutcounter -= 1
                x = count + 1
            End If
  
            If count + 1 = x + permutcounter Then
                pointer += 1
                x = count + 1
            End If
  
  
        End While
  
    End Sub
  
    Public Function MakeCombination(ByVal word As String) As List(Of String)
  
        'donne toutes les combinaisons d'une chaine de caractères
        'le temps traitement et la mémoire exigés dependent de la longueur de la chaine
        'combinaison de 1 2 3 4 5 6 7 8 ..N lettres
        ' si j'ai un chaine de N lettres j'ai donc 2^N -1 combinaisons
        ' mot 1 lettre = N!/((N-1)! * 1!)
        ' 2 lettres = N!/((N-2)! * 2!)
        ' 3 lettres = N!/((N-3)! * 3!)
        ' 4 lettres = N!/((N-4)! * 4!)
        ' 5 lettres = N!/((N-5)! * 5!)
        ' 6 lettres = N!/((N-6)! * 7!)
        ' 7 lettres = N!/((N-7)! * 7!)
        ' 8 lettres = N!/((N-8)! * 8!)
        ' N lettres = N!/((N-N)! * N!)
  
        ' pour obtenir toutes les combinaisons on se sert d'une boucle qui iter varie de 1 à 2^N -1
        ' iter est converti en binaire et devancé par des 0 de façon à obtenir toujours N chiffres
        ' on remplace les 1 du nombre binaire par le caractère du meme index de la chaine
        ' on retire les 0 de la chaine
  
        Dim strbinary As String
  
        Dim binarydigit As Char()
        Dim list1 As New List(Of String)
        For iter = 1 To 2 ^ (word.Length)
  
            strbinary = Convert.ToString(Convert.ToInt32(iter), 2)
            strbinary = strbinary.PadLeft(word.Length, "0"c)
            binarydigit = strbinary.ToCharArray
            For iter2 = 0 To binarydigit.Length - 1
                If binarydigit(iter2) = "1" Then
                    binarydigit(iter2) = word(iter2)
  
                End If
            Next
            strbinary = binarydigit
            strbinary = strbinary.Replace("0", String.Empty)
            If strbinary.Length > 0 Then
                list1.Add(strbinary)
            End If
        Next
        list1 = list1.Distinct.ToList
        list1.Sort()
        Return list1
    End Function
End Class