Prüfen, ob String palindromisch ist in C++

Jinku Hu 12 Oktober 2023
  1. Verwenden Sie den string-Kopierkonstruktor mit den rbegin/rend-Methoden, um in C++ zu prüfen, ob eine Zeichenkette palindromisch ist
  2. Verwendung der Methode std::equal zur Prüfung auf String-Palindrome in C++
  3. Benutzerdefinierte Funktion zur Prüfung auf String-Palindrome in C++ verwenden
Prüfen, ob String palindromisch ist in C++

Dieser Artikel erklärt verschiedene Methoden, wie man in C++ prüfen kann, ob eine Zeichenkette ein Palindrom ist.

Verwenden Sie den string-Kopierkonstruktor mit den rbegin/rend-Methoden, um in C++ zu prüfen, ob eine Zeichenkette palindromisch ist

Die Objekte der Klasse string unterstützen den Vergleich mit dem Operator ==, und dieser kann verwendet werden, um eine Zeichenkette zu finden, die dem Palindrom-Muster entspricht. Da das Palindrom den Vergleich der Zeichen in umgekehrter Reihenfolge impliziert, müssen wir ein neues String-Objekt mit den Iteratoren rbegin und rend konstruieren. Der Rest wird nach Bedarf in der if-Anweisung konstruiert.

Im folgenden Beispiel deklarieren wir zwei Zeichenketten - Ein-Wort-Palindrom und Mehr-Wort-Palindrom. Beachten Sie, dass diese Methode die Zeichenkette mit Leerzeichen nicht als Palindrom erkennen kann, obwohl sie dem Definitionsmuster entspricht.

#include <iostream>
#include <string>

using std::cin;
using std::cout;
using std::endl;
using std::equal;
using std::remove;
using std::string;

int main() {
  string s1 = "radar";
  string s2 = "Was it a cat I saw";

  if (s1 == string(s1.rbegin(), s1.rend())) {
    cout << "s1 is a palindrome" << endl;
  } else {
    cout << "s1 is not a palindrome" << endl;
  }

  if (s2 == string(s2.rbegin(), s2.rend())) {
    cout << "s2 is a palindrome" << endl;
  } else {
    cout << "s2 is not a palindrome" << endl;
  }

  return EXIT_SUCCESS;
}

Ausgabe:

s1 is a palindrome
s2 is not a palindrome

Verwendung der Methode std::equal zur Prüfung auf String-Palindrome in C++

Auch wenn die letzte Implementierung die Aufgabe bei Ein-Wort-Zeichenketten erfüllt, ist sie mit dem Overhead verbunden, eine Objektkopie zu erstellen und ganze Bereiche davon zu vergleichen. Wir können den Algorithmus std::equal verwenden, um die erste Hälfte mit der zweiten Hälfte des gleichen string-Objektbereichs zu vergleichen. std::equal gibt den booleschen Wert true zurück, wenn die Elemente in den beiden angegebenen Bereichen gleich sind. Beachten Sie, dass die Funktion nur einen Iterator benötigt - s1.rbegin() für den zweiten Bereich, da das Ende des Bereichs als first2 + (last1 - first1) berechnet wird.

#include <iostream>
#include <string>

using std::cin;
using std::cout;
using std::endl;
using std::equal;
using std::remove;
using std::string;

int main() {
  string s1 = "radar";
  string s2 = "Was it a cat I saw";

  equal(s1.begin(), s1.begin() + s1.size() / 2, s1.rbegin())
      ? cout << "s1 is a palindrome" << endl
      : cout << "s1 is not a palindrome" << endl;

  equal(s2.begin(), s2.begin() + s2.size() / 2, s2.rbegin())
      ? cout << "s2 is a palindrome" << endl
      : cout << "s2 is not a palindrome" << endl;

  return EXIT_SUCCESS;
}

Ausgabe:

s1 is a palindrome
s2 is not a palindrome

Benutzerdefinierte Funktion zur Prüfung auf String-Palindrome in C++ verwenden

Die bisherigen Methoden greifen bei Zeichenketten mit mehreren Wörtern zu kurz, was wir durch die Implementierung einer benutzerdefinierten Funktion lösen können. Das Beispiel demonstriert die boolesche Funktion checkPalindrome, die das Argument string& entgegennimmt und dessen Wert in einer lokalen string&-Variablen speichert. Das lokale Objekt wird dann mit dem transform-Algorithmus verarbeitet, um es in Kleinbuchstaben umzuwandeln, und anschließend mit dem Idiom erase-remove, um alle Leerzeichen darin zu löschen. Schließlich rufen wir den equal-Algorithmus in der Bedingung der if-Anweisung auf und geben den entsprechenden booleschen Wert zurück. Beachten Sie jedoch, dass diese Methode fehlschlägt, wenn die Zeichenkette aus Multibyte-Zeichen besteht. Es sollte also eine Kleinbuchstaben-Konvertierungsmethode implementiert werden, die alle gängigen Zeichenkodierungsschemata unterstützt.

#include <iostream>
#include <string>

using std::cin;
using std::cout;
using std::endl;
using std::equal;
using std::remove;
using std::string;

bool checkPalindrome(string& s) {
  string tmp = s;
  transform(tmp.begin(), tmp.end(), tmp.begin(),
            [](unsigned char c) { return tolower(c); });
  tmp.erase(remove(tmp.begin(), tmp.end(), ' '), tmp.end());

  if (equal(tmp.begin(), tmp.begin() + tmp.size() / 2, tmp.rbegin())) {
    return true;
  } else {
    return false;
  }
}

int main() {
  string s1 = "radar";
  string s2 = "Was it a cat I saw";

  checkPalindrome(s1) ? cout << "s1 is a palindrome" << endl
                      : cout << "s1 is not a palindrome" << endl;

  checkPalindrome(s2) ? cout << "s2 is a palindrome" << endl
                      : cout << "s2 is not a palindrome" << endl;

  return EXIT_SUCCESS;
}

Ausgabe:

s1 is a palindrome
s2 is a palindrome
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