Verificar se string é palíndromo em C++
-
Use o construtor de cópia
string
com métodosrbegin
/rend
para verificar o palíndromo de strings em C++ -
Utilize o método
std::equal
para verificar a existência de palíndromo de strings em C++ - Utilizar função personalizada para verificar a existência de palíndromo de strings em C++
Este artigo explicará vários métodos de como verificar se uma string é um palíndromo em C++.
Use o construtor de cópia string
com métodos rbegin
/ rend
para verificar o palíndromo de strings em C++
Os objectos da classe string
suportam a comparação utilizando o operador ==
, e podem ser utilizados para encontrar uma string que esteja em conformidade com o padrão palíndromo. Uma vez que o palíndromo implica a correspondência dos caracteres em ordem inversa, precisamos de construir um novo objecto de string com iteradores rbegin
e rend
. O resto é deixado para ser construído na declaração if
, conforme necessário.
No exemplo seguinte, declaramos duas strings - palíndromo de uma palavra e palíndromo de múltiplas palavras. Note-se que este método não consegue detectar a string com espaços como palíndromo, embora se ajuste ao padrão de definição.
#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;
}
Resultado:
s1 is a palindrome
s2 is not a palindrome
Utilize o método std::equal
para verificar a existência de palíndromo de strings em C++
Embora a última implementação faça o trabalho com uma só palavra, vem com a sobrecarga de criar uma cópia de objectos e comparar gamas completas dos mesmos. Podemos utilizar o algoritmo std::equal
para comparar a primeira metade com a segunda metade da mesma gama de objectos string
. O algoritmo std::equal
devolve o valor booleano true
se os elementos das duas gamas dadas forem iguais. Note-se que a função leva apenas um iterador - s1.rbegin()
para o segundo intervalo, porque o fim do intervalo é calculado 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;
}
Resultado:
s1 is a palindrome
s2 is not a palindrome
Utilizar função personalizada para verificar a existência de palíndromo de strings em C++
Os métodos anteriores ficam aquém das strings com múltiplas palavras, que podemos resolver através da implementação de uma função personalizada. O exemplo demonstra a função booleana checkPalindrome
que pega no argumento string&
e armazena o seu valor numa variável local string
. O objecto local é então processado com o algoritmo transform
para o converter para minúsculas e, consequentemente, pela expressão erase-remove
para apagar todos os caracteres de espaço branco que o compõem. Finalmente, chamamos o algoritmo “igual” na condição de declaração if
e devolvemos o valor booleano correspondente. Não se esqueça, porém, que este método falhará se a string for constituída por caracteres multibyte. Assim, deve ser implementado o método de conversão em minúsculas que suporta todos os esquemas de codificação de caracteres comuns.
#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;
}
Resultado:
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 Facebook