Stampa tutte le permutazioni della stringa in C++

Jinku Hu 12 ottobre 2023
  1. Usa std::next_permutation per stampare tutte le permutazioni della stringa in C++
  2. Usa std::prev_permutation per stampare tutte le permutazioni della stringa in C++
Stampa tutte le permutazioni della stringa in C++

Questo articolo introdurrà come stampare tutte le permutazioni della stringa data in C++.

Usa std::next_permutation per stampare tutte le permutazioni della stringa in C++

L’algoritmo std:next_permutation modifica l’intervallo dato in modo che la permutazione degli elementi sia ordinata lessicograficamente in ordine crescente e venga restituito un vero valore booleano se tale permutazione esiste. La funzione può operare sull’oggetto std::string per generare le sue permutazioni se i caratteri stringa sono ordinati in ordine decrescente. Possiamo utilizzare l’algoritmo std::sort con l’oggetto funzione std::greater per ordinare la stringa e quindi chiamare next_permutation finché non restituisce false. Quest’ultimo può essere implementato utilizzando il bucle do...while che prende l’istruzione next_permutation come espressione di condizione e stampa la stringa nel flusso cout ad ogni 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;
}

Produzione:

Enter string to print permutations: nel
nle
nel
lne
len
enl
eln

Usa std::prev_permutation per stampare tutte le permutazioni della stringa in C++

In alternativa, possiamo utilizzare un altro algoritmo da STL chiamato - std::prev_permutation che genera la nuova permutazione dell’intervallo dato con lo stesso ordine lessicografico ma memorizza la permutazione precedente quando viene fornita la sequenza. La soluzione finale rimane ancora simile all’esempio precedente, tranne per il fatto che la funzione prev_permutation viene chiamata nella condizione del cicli 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;
}

Produzione:

Enter string to print permutations: nel
nle
nel
lne
len
enl
eln

Inoltre, è possibile garantire un codice più robusto implementando la funzione di convalida della stringa utente che stamperà il prompt di input finché l’utente non fornirà la stringa valida. Si noti che tutte le soluzioni elencate analizzeranno solo l’argomento a stringa singola dall’input della riga di comando e le stringhe di più parole non verranno lette.

#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;
}

Produzione:

Enter string to print permutations: nel
nle
nel
lne
len
enl
eln
Autore: 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

Articolo correlato - C++ String