hola!
Yo preferiría hacerlo sin invertir las cadenas, porque es más fácil, pero si hay que hacerlo invirtiendo....
1 version. Sin incluir espacios, sólo palabras#include <string> // string
#include <iostream> // cin, cout
#include <cstdlib> // malloc
using namespace std;
int palindrome(const char* W)
{
char *jj;
const char *i, *j;
for(i=W ; *i ;i++) ; // compute len=(i-W)
if (!(j
=jj
=(char *)calloc(sizeof(char),(i
-W
)+1))) {
}
for( ; i > W ;i--,jj++) *jj=*(i-1); // reverse copy
for( ; *i && (*i == *j);i++,j++ ); //compare
return !*i ; // true if end reached.
}
int main(int argc, char **args)
{
string phrase;
for (; getline(cin,phrase); )
cout << palindrome(phrase.c_str()) << endl;
return 0;
}
Aquí algunos ejemplos de ejecución. 1 expresa que es palíndromo, 0 que no lo es.
1234
0
1111
1
1221
1
12344321
1
2
1
331133
1
33113
0
(intro, palabra vacía, que es palindromo)
1
2 versión. Frases que pueden incluir varias palabras separadas por espacios, blancos, tabuladores...
(Nota: Los separadores están "normalizados" por la funcion isspace(int c))#include <string> // string
#include <iostream> // cin, cout
#include <cstdlib> // malloc
#include <cctype> // isspace
#define sp(c) isspace((c)) // shortcut
using namespace std;
int palindrome(const char* W)
{
const char *i, *j;
char *jj;
for(i=W ; *i ;i++) ;
if (!(j
=jj
=(char *)calloc(sizeof(char),(i
-W
)+1))) // len=(i-W) {
}
for( ; i > W ;i--,jj++) *jj=*(i-1); // reverse copy
const char *b; // key!
for ( ; *i && (sp(*i)||sp(*j) || (*i==*j)); i+=(*i==*j)||sp(*i), j+=(*b==*j)||sp(*j)) b=i;
return !*i ; // true if end reached.
}
int main(int argc, char **args)
{
string phrase;
for (; getline(cin,phrase); )
cout << palindrome(phrase.c_str()) << endl;
return 0;
}
Algunso casos de prueba
dabale arroz a la zorra el abad
1
dabale arroz a la zorra el abad
1
dabale arroz al zorro el abad
0
(30 espacios en blanco e intro)
1
Lo que pasa es que no me da tiempo a explicarlo. Si, se que mi escritura del
for puede desconcertar a algunos, pero se trata de un doble avance...de los punteros... Dos comentarios más :
- con python no haria falta la variable "b" porque puede simular la asignacion simultanea.
- se puede prescindir una de las variables, "j" o "jj" (la que quede debe se (char *)), a cambio de un bucle similar al primero para rescatar de nuevo la longitud de la cadena, antes de el último for de comparación
Que te sirva! Y perdón por los acentos que faltan!