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

  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

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::cout; using std::endl;
using std::string; using std::cin;
using std::equal; using std::remove;

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-Zeichenfolgen 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::cout; using std::endl;
using std::string; using std::cin;
using std::equal; using std::remove;

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::cout; using std::endl;
using std::string; using std::cin;
using std::equal; using std::remove;

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

Verwandter Artikel - C++ String

  • Wie konvertiert man ein Zeichen in C++ in eine Zeichenkette
  • Wie konvertiert man Zeichenkette in C++ in Großbuchstaben