Alle möglichen Kombinationen der Zeichenanzahl "X" mit der Zeichenfolgenlänge "X" drucken (Brute Force)

Ich versuche, einen Wortkombinationsgenerator zu schreiben. Ich meine, alle möglichen Kombinationen der Zeichenanzahl "X" mit der Zeichenfolgenlänge "X" zu drucken.

Zuallererst muss ich sagen, dass ich in StackOverFlow eine Frage zu genau diesem Problem gesehen habe, die viele Antworten von Wortgeneratoren enthält, um genau dies zu tun (auf verschiedenen Sprachen), aber bitte markieren Sie dies nicht als doppelt oder nicht Kommentieren Sie meine Frage nur, um auf diesen Link zu verweisen, da ich ALLE C # - und VBNET-Codes dieser Frage getestet habe und wirklich keiner zu 100% wie erwartet funktioniert.

Wenn ich beispielsweise die Zeichen "a", "b" und "c" habe und alle Kombinationen dieser Zeichen in einer Zeichenfolge mit der Länge "3" erstellen möchte, ist dies das erwartete Ergebnis:

' Expected result, 27 combinations:
'
' aaa
' aab
' aac
'
' aba
' abb
' abc
'
' aca
' acb
' acc
'
' baa
' bab
' bac
'
' bba
' bbb
' bbc
'
' bca
' bcb
' bcc
'
' caa
' cab
' cac
'
' cba
' cbb
' cbc
'
' cca
' ccb
' ccc

(Die Sorte spielt keine Rolle, ich kann sie später sortieren.)

... Aber so weit von diesem erwarteten Ergebnis ist das, was ich bekommen könnte:

'a
'aa
'aaa
'b
'bb
'bbb
'c
'cc
'ccc

Ich habe dies vor einiger Zeit in zwei Sprachen (Ruby und Batch) gemacht, benutze aber verschachtelte Fors (viele Fors zusammen, um jeweils nur einen Buchstaben an den anderen anzuhängen, für die Ausgabe), natürlich. Wenn ich dies in VBNET versuche, ist das um zu vermeiden, dass viele Fors angeklagt werden, und um es auf eine leistungsstärkere Weise zu tun.

Im folgenden Code können Sie sehen, wie ich versuche, alle Kombinationen im RAM-Speicher (einem Array) zuzuweisen, anstatt sie auf die physische Festplatte zu schreiben. Daher möchte ich diesen Code mit einer logischen Methode und auf eine leistungsfähigere Weise schreiben Ich möchte zuerst alle Kombinationen "im Speicher" speichern, und das ist auch der Grund, warum ich nicht viele fors (die Leistung) verwenden möchte.

Dies war mein letzter Versuch, alles wird in Kommentarzeilen erklärt:

Public Class Form1

    Dim characters As Char()  ' Default value: {"a","b","c"}
    Dim StringLength As Int64 ' Default value: 3
    Dim TotalCombinations As Int64 ' Default value: 27
    Dim strarray(99999999) As String ' Default size: "99.999.999" million of combinations in memory (I need to confirm this from an expert).

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

    Dim index As Int64 = 0

    For column As Int64 = 0 To TotalCombinations - 1 ' For 0 to 26

        For Each character As Char In characters ' Characters = {"a","b","c"}

            If column < index Then
                index = 0 ' I reset index value 'cause... just experimenting things.
                Try
                    strarray(index) += characters(index)
                    RichTextBox1.Text += strarray(index) & ControlChars.NewLine
                Catch
                End Try
            Else
                Try
                    strarray(index) += characters(index)
                    RichTextBox1.Text += strarray(index) & ControlChars.NewLine
                Catch
                End Try
            End If
        Next

        index += 1

    Next

    End Sub

    Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged
        characters = sender.text.ToCharArray ' Result: {"a","b","c"}
        Calculate_Combinations() ' Result: 27
    End Sub

    Private Sub NumericUpDown1_ValueChanged(sender As Object, e As EventArgs) Handles NumericUpDown1.ValueChanged
        StringLength = sender.value ' Result: 3
        Calculate_Combinations() ' Result: 27
    End Sub

    Private Sub Calculate_Combinations()
        Try
            TotalCombinations = ((characters.LongLength * StringLength) * StringLength) ' Result: 27
            Label1.Text = ((characters.LongLength * StringLength) * StringLength) & " number of combinations." ' Result: 27
        Catch : End Try
    End Sub

End Class

Ich helfe genau.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage