Controlla se la stringa è palindromo in C++
-
Usa il costruttore di copia
string
con i metodirbegin
/rend
per controllare il palindromo delle stringhe in C++ -
Usa il metodo
std::equal
per controllare il palindromo delle stringhe in C++ - Usa la funzione personalizzata per verificare il palindromo delle stringhe 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
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