Controlla se la stringa è palindromo in C++

Jinku Hu 12 ottobre 2023
  1. Usa il costruttore di copia string con i metodi rbegin / rend per controllare il palindromo delle stringhe in C++
  2. Usa il metodo std::equal per controllare il palindromo delle stringhe in C++
  3. Usa la funzione personalizzata per verificare il palindromo delle stringhe in C++
Controlla se la stringa è palindromo in C++

Questo articolo spiegherà diversi metodi su come verificare se una stringa è un palindromo in C++.

Usa il costruttore di copia string con i metodi rbegin / rend per controllare il palindromo delle stringhe in C++

Gli oggetti della classe string supportano il confronto utilizzando l’operatore == e possono essere utilizzati per trovare una stringa che sia conforme al modello palindromo. Poiché il palindromo implica la corrispondenza dei caratteri in ordine inverso, dobbiamo costruire un nuovo oggetto stringa con gli iteratori rbegin e rend. Il resto è lasciato da costruire nell’istruzione if, se necessario.

Nell’esempio seguente, dichiariamo due stringhe: palindromo di una parola e palindromo di più parole. Si noti che questo metodo non è in grado di rilevare la stringa con spazi come un palindromo, sebbene si adatti allo schema di definizione.

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

Produzione:

s1 is a palindrome
s2 is not a palindrome

Usa il metodo std::equal per controllare il palindromo delle stringhe in C++

Anche se l’ultima implementazione fa il lavoro su stringhe di una sola parola, viene fornito con il sovraccarico di creare una copia dell’oggetto e confrontarne gli intervalli completi. Possiamo utilizzare l’algoritmo std::equal per confrontare la prima metà con la seconda metà della stessa gamma di oggetti stringa. std::equal restituisce il valore booleano true se gli elementi nei due intervalli dati sono uguali. Notare che la funzione richiede un solo iteratore - s1.rbegin() per il secondo intervallo, perché la fine dell’intervallo è calcolata come 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;
}

Produzione:

s1 is a palindrome
s2 is not a palindrome

Usa la funzione personalizzata per verificare il palindromo delle stringhe in C++

I metodi precedenti non sono all’altezza delle stringhe con più parole, che possiamo risolvere implementando una funzione personalizzata. L’esempio mostra la funzione booleana checkPalindrome che accetta l’argomento string& e memorizza il suo valore in una variabile string& locale. L’oggetto locale viene quindi elaborato con l’algoritmo transform per convertirlo in minuscolo e, di conseguenza, dall’idioma cancella-rimuovi per eliminare tutti i caratteri di spazio in esso contenuti. Infine, chiamiamo l’algoritmo equal nella condizione dell’istruzione if e restituiamo il valore booleano corrispondente. Ricorda però che questo metodo fallirà se la stringa è composta da caratteri multibyte. Pertanto, dovrebbe essere implementato il metodo di conversione in minuscolo che supporti tutti i comuni schemi di codifica dei caratteri.

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

Produzione:

s1 is a palindrome
s2 is a palindrome
Autore: 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

Articolo correlato - C++ String