Verificar se string é palíndromo em C++

Jinku Hu 12 outubro 2023
  1. Use o construtor de cópia string com métodos rbegin / rend para verificar o palíndromo de strings em C++
  2. Utilize o método std::equal para verificar a existência de palíndromo de strings em C++
  3. Utilizar função personalizada para verificar a existência de palíndromo de strings em C++
Verificar se string é palíndromo 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
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

Artigo relacionado - C++ String