Comprueba si la cadena es el palíndromo en C++
-
Usa los métodos de
string
Copy Constructor conrbegin
/rend
para comprobar si es un palíndromo de cadena en C++ -
Usa el método
std::equal
para comprobar si hay palíndromo de cadena en C++ - Use la función personalizada para comprobar el palíndromo de la cadena 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
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 FacebookArtículo relacionado - C++ String
- Encuentre el primer carácter repetido en una cadena en C++
- Encuentre la subcadena común más larga en C++
- Poner en mayúscula la primera letra de una cadena en C++
- Comparación de cadenas y caracteres en C++
- Eliminar el último carácter de una cadena en C++
- Obtener el último carácter de una cadena en C++