Vérifier si la chaîne est palindrome en C++

Jinku Hu 12 octobre 2023
  1. 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++
  2. Utilisez la méthode std::equal pour vérifier la présence d’une chaîne palindrome en C++
  3. Utiliser une fonction personnalisée pour vérifier la présence de la chaîne Palindrome en C++
Vérifier si la chaîne est 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
Auteur: 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

Article connexe - C++ String