Prüfen, ob String palindromisch ist in C++
-
Verwenden Sie den
string
-Kopierkonstruktor mit denrbegin
/rend
-Methoden, um in C++ zu prüfen, ob eine Zeichenkette palindromisch ist -
Verwendung der Methode
std::equal
zur Prüfung auf String-Palindrome in C++ - 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::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
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 FacebookVerwandter Artikel - C++ String
- Finden Sie das erste sich wiederholende Zeichen in einer Zeichenfolge in C++
- Finden Sie die längste gemeinsame Teilzeichenfolge in C++
- Großschreiben des ersten Buchstabens einer Zeichenfolge in C++
- Vergleich von String und Character in C++
- Entfernen Sie das letzte Zeichen aus einer Zeichenkette in C++
- Abrufen des letzten Zeichens einer Zeichenkette in C++