Comprueba si la cadena es el palíndromo en C++

Jinku Hu 12 octubre 2023
  1. Usa los métodos de string Copy Constructor con rbegin/rend para comprobar si es un palíndromo de cadena en C++
  2. Usa el método std::equal para comprobar si hay palíndromo de cadena en C++
  3. Use la función personalizada para comprobar el palíndromo de la cadena en C++
Comprueba si la cadena es el palíndromo en C++

Este artículo explicará varios métodos para comprobar si una cadena es un palíndromo en C++.

Usa los métodos de string Copy Constructor con rbegin/rend para comprobar si es un palíndromo de cadena en C++

Los objetos de la clase string soportan la comparación usando el operador ==, y puede ser utilizado para encontrar una cadena que se ajuste al patrón del palíndromo. Dado que el palíndromo implica la coincidencia de los caracteres en orden inverso, necesitamos construir un nuevo objeto de cadena con los iteradores rbegin y rend. El resto se deja para ser construido en la declaración if, según sea necesario.

En el siguiente ejemplo, declaramos dos cadenas - palíndromo de una palabra y palíndromo de múltiples palabras. Note que este método no puede detectar la cadena con espacios como palíndromo, aunque se ajusta al patrón de definición.

#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;
}

Producción :

s1 is a palindrome
s2 is not a palindrome

Usa el método std::equal para comprobar si hay palíndromo de cadena en C++

Aunque la última implementación hace el trabajo en cadenas de una sola palabra, viene con la sobrecarga de crear una copia del objeto y comparar rangos completos de ellos. Podemos utilizar el algoritmo std::equal para comparar la primera mitad con la segunda mitad del mismo rango de objetos de string. std::equal devuelve el valor booleano true si los elementos de los dos rangos dados son iguales. Observe que la función toma sólo un iterador - s1.rbegin() para el segundo rango, porque el final del rango se calcula como 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;
}

Producción :

s1 is a palindrome
s2 is not a palindrome

Use la función personalizada para comprobar el palíndromo de la cadena en C++

Los métodos anteriores se quedan cortos en cadenas con múltiples palabras, que podemos resolver implementando una función personalizada. El ejemplo demuestra la función booleana checkPalindrome que toma el argumento string& y almacena su valor en una variable local string. El objeto local se procesa entonces con el algoritmo transform para convertirlo en minúsculas y, consecuentemente, con el erase-remove para eliminar todos los caracteres en blanco. Finalmente, llamamos al algoritmo equal en la condición if y devolvemos el valor booleano correspondiente. Sin embargo, tenga en cuenta que este método fallará si la cadena se compone de caracteres multibyte. Por lo tanto, se debe implementar el método de conversión de minúsculas que soporta todos los esquemas de codificación de caracteres comunes.

#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;
}

Producción :

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

Artículo relacionado - C++ String