Imprimir todas las permutaciones de la cadena en C++

Jinku Hu 12 octubre 2023
  1. Utilice std::next_permutation para imprimir todas las permutaciones de la cadena en C++
  2. Utilice std::prev_permutation para imprimir todas las permutaciones de la cadena en C++
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
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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 Facebook

Artículo relacionado - C++ String