Alle Permutationen des Strings in C++ ausgeben

Jinku Hu 12 Oktober 2023
  1. Verwenden Sie std::next_permutation, um alle Permutationen des Strings in C++ auszugeben
  2. Verwenden Sie std::prev_permutation, um alle Permutationen des Strings in C++ auszugeben
Alle Permutationen des Strings in C++ ausgeben

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
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

Verwandter Artikel - C++ String