Wie Sie wahrscheinlich bereits wissen, ist die Anzahl der möglichen Kombinationen 2 ^ n , wobei n gleich der Länge der Eingabezeichenfolge ist.
Da n theoretisch ziemlich groß sein könnte, besteht die Möglichkeit, dass 2 ^ n die Kapazität eines primitiven Typs wie int . (Der Benutzer muss möglicherweise ein paar Jahre warten, bis alle Kombinationen den Druckvorgang beendet haben, aber das ist ihre Aufgabe.)
Verwenden wir stattdessen einen Bitvektor, um alle möglichen Kombinationen zu speichern. Wir setzen die Anzahl der Bits auf n und initialisieren sie alle auf 1. Wenn beispielsweise die Eingabezeichenfolge "abcdefghij" lautet, sind die anfänglichen Bitvektorwerte {1111111111}.
Für jede Kombination müssen wir einfach alle Zeichen in der Eingabezeichenfolge durchlaufen und jedes in Großbuchstaben setzen, wenn das entsprechende Bit eine 1 ist, ansonsten auf Kleinbuchstaben setzen. Wir dekrementieren dann den Bitvektor und wiederholen.
Zum Beispiel würde der Prozess für eine Eingabe von "abc" so aussehen:
Bits: Entsprechende Combo:
111 ABC
110 ABc
101 Abc
100 Abc
011 aBC
010 aBc
001 abC
000 abc
Durch die Verwendung einer Schleife anstelle eines rekursiven Funktionsaufrufs vermeiden wir auch die Möglichkeit einer Stapelüberlauf-Ausnahme bei großen Eingabezeichenfolgen.
Hier ist die eigentliche Implementierung:
%Vor%Ich bin mir nicht sicher, ob das funktionieren wird, da ich Java seit drei Jahren nicht mehr benutzt habe, aber ich habe es zuerst in PHP geschrieben und es funktionierte. Es gibt ein Array zurück, das alle permutierten Strings enthält. Es ist eine rekursive Methode:
%Vor%Wenn Sie interessiert sind, ist die PHP, die ich kenne, funktioniert:
%Vor%Tags und Links java permutation uppercase lowercase