Vérifier si la chaîne est palindrome en C++
-
Utilisez le constructeur de copie de chaîne de caractères avec les méthodes
rbegin
/rend
pour vérifier si une chaîne est un palindrome en C++ -
Utilisez la méthode
std::equal
pour vérifier la présence d’une chaîne palindrome en C++ - Utiliser une fonction personnalisée pour vérifier la présence de la chaîne Palindrome en C++
Cet article explique plusieurs méthodes pour vérifier si une chaîne de caractères est un palindrome en C++.
Utilisez le constructeur de copie de chaîne de caractères avec les méthodes rbegin
/rend
pour vérifier si une chaîne est un palindrome en C++
Les objets de classe string
permettent de faire des comparaisons en utilisant l’opérateur ==
, et peuvent être utilisés pour trouver une chaîne de caractères conforme au modèle de palindrome. Comme le palindrome implique la correspondance des caractères dans l’ordre inverse, nous devons construire un nouvel objet chaîne avec les itérateurs rbegin
et rend
. Le reste doit être construit dans l’instruction if
selon les besoins.
Dans l’exemple suivant, nous déclarons deux chaînes de caractères - palindrome d’un mot et palindrome de plusieurs mots. Notez que cette méthode ne peut pas détecter la chaîne avec des espaces comme palindrome, bien qu’elle corresponde au modèle de définition.
#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;
}
Production :
s1 is a palindrome
s2 is not a palindrome
Utilisez la méthode std::equal
pour vérifier la présence d’une chaîne palindrome en C++
Même si la dernière implémentation fait le travail sur des chaînes d’un seul mot, elle s’accompagne d’un surcroît de travail consistant à créer une copie de l’objet et à en comparer des gammes complètes. Nous pouvons utiliser l’algorithme std::equal
pour comparer la première moitié avec la seconde moitié de la même plage d’objets string
. L’algorithme std::equal
renvoie la valeur booléenne true
si les éléments dans les deux intervalles donnés sont égaux. Notez que la fonction ne prend qu’un seul itérateur - s1.rbegin()
pour la deuxième plage, parce que la fin de la plage est calculée comme first2 + (last1 - first1)
.
#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;
}
Production :
s1 is a palindrome
s2 is not a palindrome
Utiliser une fonction personnalisée pour vérifier la présence de la chaîne Palindrome en C++
Les méthodes précédentes ne permettent pas d’obtenir des chaînes de caractères contenant plusieurs mots, ce que nous pouvons résoudre en mettant en œuvre une fonction personnalisée. L’exemple montre la fonction booléenne checkPalindrome
qui prend l’argument string&
et stocke sa valeur dans une variable string
locale. L’objet local est ensuite traité avec l’algorithme de transformation pour le convertir en minuscules et, par conséquent, avec l’idiome effacer-supprimer
pour supprimer tous les caractères d’espacement. Enfin, nous appelons l’algorithme equal
dans la condition d’instruction if
et nous retournons la valeur booléenne correspondante. Notez cependant que cette méthode échouera si la chaîne est constituée de caractères de plusieurs octets. Il faut donc mettre en œuvre la méthode de conversion des minuscules qui prend en charge tous les schémas de codage de caractères courants.
#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;
}
Production :
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 FacebookArticle connexe - C++ String
- Comparaison de chaîne et de caractère en C++
- Supprimer le dernier caractère d'une chaîne en C++
- Obtenir le dernier caractère d'une chaîne en C++
- Différences entre l'opérateur sizeof et la fonction strlen pour les chaînes en C++
- Effacer la chaîne en C++
- Imprimer toutes les permutations de la chaîne en C++