Imprimir todas las permutaciones de la cadena en C++
-
Utilice
std::next_permutation
para imprimir todas las permutaciones de la cadena en C++ -
Utilice
std::prev_permutation
para imprimir todas las permutaciones de la cadena en C++
Este artículo presentará cómo imprimir todas las permutaciones de la cadena dada en C++.
Utilice std::next_permutation
para imprimir todas las permutaciones de la cadena en C++
El algoritmo std:next_permutation
modifica el rango dado para que la permutación de los elementos se ordene lexicográficamente en orden ascendente, y se devuelva un valor booleano verdadero si tal permutación existe. La función puede operar en el objeto std::string
para generar sus permutaciones si los caracteres de la cadena se ordenan en orden descendente. Podemos utilizar el algoritmo std::sort
con el objeto de función std::greater
para ordenar la cadena y luego llamar a next_permutation
hasta que devuelva falso. Este último se puede implementar usando el bucle do...while
que toma la declaración next_permutation
como expresión de condición e imprime la cadena en el flujo cout
en cada bucle.
#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;
}
Producción :
Enter string to print permutations: nel
nle
nel
lne
len
enl
eln
Utilice std::prev_permutation
para imprimir todas las permutaciones de la cadena en C++
Alternativamente, podemos utilizar otro algoritmo de STL llamado - std::prev_permutation
que genera la nueva permutación del rango dado con el mismo orden lexicográfico pero almacena la permutación anterior cuando se proporciona la secuencia. La solución final sigue siendo similar al ejemplo anterior, excepto que la función prev_permutation
se llama en la condición de bucle while
.
#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;
}
Producción :
Enter string to print permutations: nel
nle
nel
lne
len
enl
eln
Además, se puede garantizar un código más robusto implementando la función de validación de la cadena del usuario que imprimirá la solicitud de entrada hasta que el usuario proporcione la cadena válida. Tenga en cuenta que todas las soluciones enumeradas analizarán solo el argumento de cadena única de la entrada de la línea de comando y no se leerán cadenas de varias palabras.
#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;
}
Producción :
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 FacebookArtículo relacionado - C++ String
- Encuentre el primer carácter repetido en una cadena en C++
- Encuentre la subcadena común más larga en C++
- Poner en mayúscula la primera letra de una cadena en C++
- Comparación de cadenas y caracteres en C++
- Eliminar el último carácter de una cadena en C++
- Obtener el último carácter de una cadena en C++