Alle Permutationen des Strings in C++ ausgeben
-
Verwenden Sie
std::next_permutation
, um alle Permutationen des Strings in C++ auszugeben -
Verwenden Sie
std::prev_permutation
, um alle Permutationen des Strings in C++ auszugeben
In diesem Artikel wird vorgestellt, wie alle Permutationen der angegebenen Zeichenkette in C++ gedruckt werden.
Verwenden Sie std::next_permutation
, um alle Permutationen des Strings in C++ auszugeben
Der Algorithmus std:next_permutation
modifiziert den gegebenen Bereich so, dass die Permutation der Elemente lexikographisch in aufsteigender Reihenfolge geordnet wird und ein echter boolescher Wert zurückgegeben wird, wenn eine solche Permutation existiert. Die Funktion kann mit dem std::string
-Objekt arbeiten, um seine Permutationen zu generieren, wenn die Zeichenketten in absteigender Reihenfolge sortiert sind. Wir können den std::sort
-Algorithmus mit dem std::greater
-Funktionsobjekt verwenden, um den String zu sortieren und dann next_permutation
aufrufen, bis er false zurückgibt. Letzteres kann mit der Schleife do...while
implementiert werden, die die Anweisung next_permutation
als Bedingungsausdruck nimmt und den String in jedem Zyklus an den Stream cout
ausgibt.
#include <algorithm>
#include <iostream>
#include <iterator>
#include <limits>
using std::cin;
using std::cout;
using std::endl;
using std::string;
void PrintStringPermutations(string &str) {
std::sort(str.begin(), str.end(), std::greater<>());
do {
cout << str << endl;
} while (std::next_permutation(str.begin(), str.end()));
}
int main() {
string input;
cout << "Enter string to print permutations: ";
cin >> input;
PrintStringPermutations(input);
return EXIT_SUCCESS;
}
Ausgabe:
Enter string to print permutations: nel
nle
nel
lne
len
enl
eln
Verwenden Sie std::prev_permutation
, um alle Permutationen des Strings in C++ auszugeben
Alternativ können wir einen anderen Algorithmus von STL namens std::prev_permutation
verwenden, der die neue Permutation des gegebenen Bereichs mit derselben lexikographischen Reihenfolge erzeugt, aber die vorherige Permutation speichert, wenn die Sequenz bereitgestellt wird. Die endgültige Lösung bleibt dem vorherigen Beispiel ähnlich, außer dass die Funktion prev_permutation
in der Schleifenbedingung while
aufgerufen wird.
#include <algorithm>
#include <iostream>
#include <iterator>
#include <limits>
using std::cin;
using std::cout;
using std::endl;
using std::string;
void PrintStringPermutations(string &str) {
std::sort(str.begin(), str.end(), std::greater<>());
do {
cout << str << endl;
} while (std::prev_permutation(str.begin(), str.end()));
}
int main() {
string input;
cout << "Enter string to print permutations: ";
cin >> input;
PrintStringPermutations(input);
return EXIT_SUCCESS;
}
Ausgabe:
Enter string to print permutations: nel
nle
nel
lne
len
enl
eln
Außerdem kann man einen robusteren Code sicherstellen, indem man die BenutzerZeichenkettenvalidierungsfunktion implementiert, die die Eingabeaufforderung druckt, bis der Benutzer die gültige Zeichenkette liefert. Beachten Sie, dass alle aufgelisteten Lösungen nur das EinzelZeichenkettenargument aus der Befehlszeileneingabe analysieren und MehrwortZeichenketten nicht gelesen werden.
#include <algorithm>
#include <iostream>
#include <iterator>
#include <limits>
using std::cin;
using std::cout;
using std::endl;
using std::string;
void PrintStringPermutations(string &str) {
std::sort(str.begin(), str.end(), std::greater<>());
do {
cout << str << endl;
} while (std::prev_permutation(str.begin(), str.end()));
}
template <typename T>
T &validateInput(T &val) {
while (true) {
cout << "Enter string to print permutations: ";
if (cin >> val) {
break;
} else {
if (cin.eof()) exit(EXIT_SUCCESS);
cout << "Enter string to print permutations\n";
cin.clear();
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}
}
return val;
}
int main() {
string input;
validateInput(input);
PrintStringPermutations(input);
return EXIT_SUCCESS;
}
Ausgabe:
Enter string to print permutations: nel
nle
nel
lne
len
enl
eln
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn FacebookVerwandter Artikel - C++ String
- Finden Sie das erste sich wiederholende Zeichen in einer Zeichenfolge in C++
- Finden Sie die längste gemeinsame Teilzeichenfolge in C++
- Großschreiben des ersten Buchstabens einer Zeichenfolge in C++
- Vergleich von String und Character in C++
- Entfernen Sie das letzte Zeichen aus einer Zeichenkette in C++
- Abrufen des letzten Zeichens einer Zeichenkette in C++