Saber si una palabra es un palíndromo con Java

19/Sep/2007 Java , 41 Comentarios
Programación en Java

Uno de los primeros programas que recuerdo resolver en la Universidad, cuando estudiaba informática, es el saber si una palabra es un palíndromo.

Palíndromo, 1. m. Palabra o frase que se lee igual de izquierda a derecha, que de derecha a izquierda; p. ej., anilina; dábale arroz a la zorra el abad.

Mediante el lenguaje Java unas pocas líneas de código nos ayudarán a resolver el problema. La idea general es ir recorriendo la palabra desde izquierda a derecha, incrementando carácter a carácter y a la misma vez ir recorriendo la palabra de derecha a izquierda, decrementando los caracteres.

En cada incremento/decremento compararemos los valores de los caracteres. Si son iguales, la palabra podrá ser un palíndromo, en cuanto tengamos dos valores distintos, la palabra ya no será un palíndromo.

Pero veámoslo con código. Lo primero será definir la palabra y las posiciones inicio y fin.

int inc = 0;
int des = sPalabra.length()-1;
boolean bError = false;

Además hemos declarado una variable que actuará en forma de guarda, por lo que inicialmente consideramos que no hemos encontrado incongruencias en la palabra.

Hay que fijarse que la posición inicial será 0 y la final, el ultimo carácter. Este valor lo conseguimos restandole 1 al tamaño de la cadena.

Ahora el bucle. Tenemos que iterar por la cadena mientras los contadores no se crucen y mientras no hayamos encontrado ningún error. De esta manera, el código del bucle quedará de la siguiente forma:

while ((inc<des) && (!bError)){...}

Y dentro del bucle la validación de caracteres. Todo el código sería:

while ((inc<des) && (!bError)){
			
	if (sPalabra.charAt(inc)==sPalabra.charAt(des)){				
		inc++;
		des--;
	} else {
		bError = true;
	}
}

Vemos, que si algún par de caracteres no coinciden, entonces se cambia el valor de la variable de guarda, lo que hará que nos salgamos del bucle inmediatamente.

Una vez que hayamos salido del bucle, la variable de guarda nos dirá si la palabra es un palíndromo. Esto es si sigue con el valor inicial, es decir false.

if (!bError)
	System.out.println(sPalabra + " es un PALINDROMO");
else
	System.out.println(sPalabra + " NO es un palindromo");

Vídeos sobre Java


41 comentarios en “Saber si una palabra es un palíndromo con Java”

Víctor Cuervo

LILIAN

Escriba un programa que determine si una palabra es palíndromo. Un palíndromo es un array de caracteres que se lee de igual forma en ambos sentidos; por ejemplo ana.

Víctor Cuervo

Alejandro Coronado Rubio

Adjunto mi solución al problema, fue lo más sencillo que se me ocurrió

String palabra = JOptionPane.showInputDialog(«Inserta una palabra»);
String palabra2 = palabra.toLowerCase().replace(» «, «»);
String palindromo = new String();

char [] invertir = palabra2.toCharArray();

for(int i = invertir.length-1 ; i>=0; i–){
palindromo += invertir[i];
}

JOptionPane.showMessageDialog(null, (palabra2.equals(palindromo) ? palabra + » es un palíndromo» : palabra + » no es un palíndromo»));

Víctor Cuervo

donovan david

QUIEN ME ALLUDA CON ESTE CODIGO

En una lista encadenada circular se almacenan palabras o numeros se pide realizar clases, metodos,y el provador para registrar una palabra o numero y determinar si es palindrome o capicua

Víctor Cuervo

fernando

Problemática:
– Desarrolla una aplicación, la cual debe realizar lo siguiente:
a) Ingresar una palabra o frase, por parte del usuario.
b) Mostrar la cadena de caracteres ingresada y la cantidad de caracteres que tiene. Lo anterior de la siguiente forma «palabra o frase tiene __ caracteres».
c) Invertir la cadena y mostrarla.
d) Identificar y mencionar si la palabra o frase ingresada, es un palíndromo. Mostrando en una ventana de dialogo de mensaje el texto «Si es palíndromo» o de lo contrario «No es palíndromo».

se como crear

Víctor Cuervo

yaguarete79

Existe una forma más sencilla, y es utilizando recursión.
La forma más elegante es utilizar un método al que vamos a llamar con la palabra solamente, y dicho método llama al recursivo con más parámetros, en este caso, índice de inicio e indice final.
De esta forma, voy comparando la primer letra contra la última de la palabra, en la primer llamada. Luego en el siguiente llamado comparo la segunda letra contra la penúltima, y así sucesivamente mientras sean iguales y hasta que llegue al caso base, que es que esté «visualizando» un string de largo 0 (terminé de recorrer un string de largo par) o uno de largo 1 (cuando el largo es impar).
Si en cualquier momento antes de llegar al caso base, una comparación me da false, ya no sigo recorriendo y retorno false. Esto hace además, eficiente la recorrida, y como todo método recursivo conlleva muchas menos líneas de código.
Espero les sirva.

public static boolean esPalindromo(String palabra){
return esPalindromo(palabra, 0, palabra.length()-1);
}

private static boolean esPalindromo(String palabra, int ini, int fin){
//si el largo es par, cuando llego a largo 0 llegué a mi caso base
//si es impar, cuando llego a largo 1 terminé de recorrer el string
//(debido al desfase de índices en Java (comienzan en 0 en lugar de 1),
//sumo 1 a la resta de las posiciones final e inicial, para que dicha diferencia sea
//igual al largo real de la porción de palabra que estoy recorriendo
if(fin-ini+1==0 || fin-ini+1 == 1)
return true;
else{
if(palabra.charAt(ini) == palabra.charAt(fin)){
return esPalindromo(palabra, ini+1, fin-1);
}
else{
return false;
}
}
}

Víctor Cuervo

gonzalo alonso

calla guarra

Víctor Cuervo

AHMED

CALLATE TU IMPURO.

TE LLEVARÉ ANTE ALA Y TE LAPIDAREMOS CUANDO EL SOL ESTE EN SU CENIT, SOLO TENDRAS DERECHO A HABLAR DESPUES DE HABER RECIVIDO 5000 LATIGAZOS ANTES DE LA LAPIDACION.

ALEA JACTA EST.

Víctor Cuervo

IVANOCHA777

Inclinaos ante el peor jugador de EWEST

Víctor Cuervo

dimas colon

package teclado;
import javax.swing.*;
public class Palindrome {

public static void main(String[] args) {
// TODO Auto-generated method stub
String c = new String(JOptionPane.showInputDialog(«cadena»)); /*atrapo la cadena como string*/
/*declaro una variable stringbuffer para convertir el string ingresado a stribgbuffer*/
StringBuffer cadena_a_buffer = new StringBuffer(c);
StringBuffer na= cadena_a_buffer.reverse(); /*uso el metodo reverse para escribirla al reves*/

StringBuffer sbuf = new StringBuffer(na); /*creo una variable para que la palabra al rever la pueda volver a string*/
String cadreversaenstring = sbuf.toString(); /* la convierto a string*/

System.out.println(c);
System.out.println(cadreversaenstring);

if(c.equals(cadreversaenstring)) { /*las comparo*/
System.out.print(«SI ES PALINDROME»);
}
else {
System.out.print(«no es palindrome»);
}

}
}

Víctor Cuervo

rolando lizarraga

/*Con el siguiente código limpias de espacios en blanco la cadena*/

String str=»hola mundo de nuevo»;
String sinespacios=str.replaceAll(«\\s+»,»»);
System.out.println(«EL sistema dice: «+sinespacios );

/*Hay que tener en cuenta que la cadena original queda intacta*/

Víctor Cuervo

yo

todo mal
codigo separa
errores de compilacion.
Deberian de poner solo codigo testeado y completo

Víctor Cuervo

yaguarete79

Hola chicos, hay un error en el código. Lo estoy probando con JavaScript que aunque no es lo mismo, les aviso de la corrección porque es a nivel de estructura, entonces no importa el lenguaje.
Se me colgaba el programa queriendo validar «anidlina», sin embargo «anilina» lo validaba bien, como debe ser.
Debuggeando el código me di cuenta que el problema es que nunca salía del loop while, y esto es debido a que como al llegar a validar «d» contra «l» y encontrar que eran diferentes, directamente se pasaba al «else», sin incrementar «inc» ni decrementar «des», por lo que nunca se cumplía la condición de salida del while.
La solución es incrementar y decrementar después del if (y el else, claro), así:
while (inc<=des){
if(verTexto.charAt(inc)==verTexto.charAt(des)){
confirmaPalindromo=true;
}
else{
confirmaPalindromo=false;
}
inc++;
des–;
}
if(confirmaPalindromo){
alert("El texto " + verTexto + " es un palíndromo");
}
else{
alert("El texto " + verTexto + " NO es un palíndromo");
}

Disculpen por pasarlo en JavaScript, pero la idea es la misma. Yo agregué unos flags para, basándome en ellos, dar el mensaje al usuario. Eso lo hará cada quien a su gusto, sólo quise contribuir un poco más.
Pero gracias porque con la idea base que dieron pude resolver este dilema.

Víctor Cuervo

donovan david

ME ALLUDA CON ESTE CODIGO PORFAVOR

En una lista encadenada circular se almacenan palabras o numeros se pide realizar clases, metodos,y el provador para registrar una palabra o numero y determinar si es palindrome o capicua

Víctor Cuervo

Breyner Ruiz (COLOMBIA-BARRANQUILLA,ATLANTICO)

joda que enredo que tienen ahi!!

Víctor Cuervo

elisa

asi es el programa completo pero falta una clase en dond se agreguen los metodos
en este caso es la clase pila

import javax.swing.*;
public class Palindrome {

public static void main(String[] args) {
String cadena;
Cola uno;
Cola dos;

cadena=JOptionPane.showInputDialog(«ingrese la cadena»);
int tam=cadena.length();
uno=new Cola(tam);
dos=new Cola(tam);
int i=0;

while(i-1){
if(cadena.charAt(k)!=’ ‘){
dos.insertar(cadena.charAt(k));
}
–k;
}

while((!uno.estaVacia())&&(!dos.estaVacia())){
char c1=uno.sacar();
char c2=dos.sacar();
if(c1==c2)
break;
}

if((uno.estaVacia())&&(dos.estaVacia())){
JOptionPane.showMessageDialog(null,»es palindromo»);
}
else{
JOptionPane.showMessageDialog(null,» no es palindromo»);
}
}

}

Víctor Cuervo

elisa

while((!uno.estaVacia())&&(!dos.estaVacia())){
char c1=uno.sacar();
char c2=dos.sacar();
if(c1==c2)
break;
}

if((uno.estaVacia())&&(dos.estaVacia())){
JOptionPane.showMessageDialog(null,»es palindromo»);
}
else{
JOptionPane.showMessageDialog(null,» no es palindromo»);
}

Víctor Cuervo

Deyner Paul Reinoso Rosado

Renz, de esta forma puedes reversar una cadena. Solo tienes que usarla en tu aplicación.

String cadenaRev=”»;
for(int i=0;i<cadena.length();i++){
cadenaRev+=cadena.charAt(i);
}

Víctor Cuervo

Renz

hola!
necesito Realizar una aplicación que contenga un TextField, y cuando se pulse un botón, invierta su contenido y lo muestre en el mismo TextField.
Además, contará con un checkbutton. Si dicho botón está marcado en el momento de pulsar el botón “INVERTIR”, se hará una comprobación adicional que nos diga si el texto escrito es un palíndromo. Este resultado se mostrará en un textfield adicional.

Víctor Cuervo

PROGRAMA DE TIEMPOS DE EJECUCION

PoR FaVoR necesitO AyUda URGENTE URGENTE URGENTE !!!!! DE UN PROGRAMA EN JAVA
ESTE EL PROBLEMA (NECESITO PRESENTAR HASTA EL DIA VIERNES)

En un servidor de la universidad se mandan programas de ordenador para ser ejecutados. Los programas llegan al servidor con una tasa de 10 por minuto. El tiempo medio de ejecución de cada programa es de 5 segundos y tanto los tiempos entre llegadas como los tiempos de ejecución se distribuyen exponencialmente.
a) ¿Qué proporción de tiempo está el servidor desocupado?
b) ¿Cuál es el tiempo esperado total de salida de un programa?
c) ¿Cuál es el número medio de programas esperando en la cola del sistema?

Y GRACIAS DE ANTEMANO POR SU AYUDA ME SERVIRIA MUCHISIMO!!!

Víctor Cuervo

Alejo

como seria todo el codigo para identificar un numero capicua

Víctor Cuervo

Deyner Paul Reinoso Rosado

Espero te sirva este método, en versiones antiguas de java puedes comparar las cadenas con «==», personalmente no lo recomiendo.

public static boolean esPalindromo(String cadena){
String cadenaRev=»»;
for(int i=0;i<cadena.length();i++){
cadenaRev+=cadena.charAt(i);
}
if(cadenaRev.equalsIgnoreCase(cadena))
return true;
else
return false;
}

Víctor Cuervo

mishi

hola como puedohacer palindromo sin utilizar metodos definidos de String y tampoco StringBuffer por favor ayudenme

Víctor Cuervo

lineadecodigo

@Deyner,

Muy bueno. :-))).

He publicado el artículo Palindromos en Java con Reverse siguiendo las indicaciones de Deyner.

Víctor Cuervo

Deyner Reinoso

Corrijo el codigo anterior:.

public void palindromo(String cadena){
StringBuffer sb=new StringBuffer(cadena);
String cadenaRev=new String(sb.reverse());//aquí creo un String con el inverso de la cadena original, luego solamente comparo la original con la reversada.

if(cadena.compareTo(cadenaRev)==0)
System.out.print(cadena+”: es un palindromo”);
else
System.out.print(cadena+”: no es palindromo”);
}

Víctor Cuervo

lineadecodigo

@lidia,

Ya está corregido el enlace para descargar el código.

Víctor Cuervo

lineadecodigo

@Kristian,

Correcto. Hay que limpiar los espacios en blanco. El problema es que con trim quitamos solo el espacio inicial y el final.

Puedes echarle un ojo a Eliminar espacios en blanco con Java

Aunque valdría un .replace(‘ ‘,»);

Espero que te sirva.

Víctor Cuervo

lineadecodigo

@Manuel,

Efectivamente, si hay acentos el código no funciona. Hay que trabajar sobre ello. A bote pronto se me ocurre un replace(‘á’,’a’), pero puede ser un poco trabajoso.

¿A alguien se le ocurre algo?

Intentaremos publicar algo al respecto.

Víctor Cuervo

lineadecodigo

@Deyner, muy buen ejemplo. Falta aplicar el método reverse sobre el StrinBuffer ;-)

Voy a ver si lo codifico para que lo tengamos explicado.

Nuevamente, muchas gracias.

Víctor Cuervo

Deyner Reinoso

una forma mas corta de hacer palindromo es usando StringBuffer asi:

public void palindromo(cadena){
StringBuffer sb=new StringBuffer(cadena);
String cadenaRev=new String(sb);

if(cadena.compareTo(cadenaRev)==0)
System.out.print(cadena+»: es un palindromo»);
else
System.out.print(cadena+»: no es palindromo»);
}

Como pueden ver el StringBuffer tiene la propiedad directa de reversar la cadena. haciendo mas facil el proceso.

Víctor Cuervo

kristian

en la parte donde va a guardar la palabra hace un trim() para ke elimine los espacios en blanco ahi deberia funcionar

salu2

Víctor Cuervo

Manuel

Tendrías que aclarar que esto es válido sin tener en cuenta espacios en blanco, ni acentos ni mayúsculas.
Por ejemplo, en «dábale arroz a la zorra el abad», no se cumpliría.
Un saludo.

Víctor Cuervo

Diana

no puedo

Víctor Cuervo

roberto

hola soy roberto quisiera que me ayudaran con el codigo en java del programa de la palabra palindrome es que la neta no e podido realizarlo espero me ayuden.Gracias

Víctor Cuervo

ITSZaS

Oigan cabe destacar que eso no esta muy claro a mi no me sirvio yo soy principiante y aun no se NADA, pero gracias de todos modos se agradece.

Víctor Cuervo

lidia

El link para descargar el archivo esta mal, se produce un error y me manda a una pagina :: «Vaya el link esta mal» corrigelo por favor.

Víctor Cuervo

unefa

import java.util.*;
import java.io.*;

class Palindrome
{
static String palabra;

static public void main(String argv[])
{
try{

Scanner archivo=new Scanner(new File(«test.txt»));

while(archivo.hasNext())
{
palabra=archivo.next();

System.out.println(palabra);
if(palindrome(palabra))
System.out.println(«si»);
else
System.out.println(«no»);

}

}
catch(FileNotFoundException x)
{
}
}

static boolean palindrome(String x)
{
if(x.equals(reverse(x)))
return true;
else
return false;
}

static String reverse(String x)
{

int n=x.length();
char temp[]=new char[n];
int z=n-1;

for(int i=0; i<n; i++)
{
temp[i]=x.charAt(z);
z–;

}
//System.out.println(«reverse:»+temp);
return temp.toString();
}
}

me podrian ayudar a resolver

Víctor Cuervo

Kimberly Morales

necesito saber que codigo utilizar para crear palindromos

Víctor Cuervo

yover

por favor quisiera saber si me pueden ayudar en este ejercicio
ingresar una frase y presentar las iniciales en maysculas.
graciasss.

Víctor Cuervo

yover

ingresar una frase y presentar en iniciales en mayusculas

Víctor Cuervo

lineadecodigo

Hola Jesús,

Se ha colado una errata en el código. Realmente se tiene que comprobar con el método charAt en ambos casos.

Ya he corregido el código.

Muchas gracias.

Víctor Cuervo

Jesus

Disculpa el ejemplo me marca error. Me lo marca en el codePointAt
Me sale esto:

Palindromo.java:30: cannot resolve symbol
symbol : method codePointAt (int)
location: class java.lang.String

if (sPalabra.charAt(inc)==sPalabra.codePointAt(des)){
^
1 error

—-jGRASP wedge2: exit code for process is 1.
—-jGRASP: operation complete.

¿Algo que nos quieras comentar?

Déjanos tu comentario, no te preocupes que tu email no será publicado

*