Compruebe si una cadena es un palíndromo en Java

1. Introducción

En este artículo, veremos cómo podemos verificar si una Cadena dada es un palíndromo usando Java.

Un palíndromo es una palabra, frase, número u otra secuencia de caracteres que se lee igual al revés que al frente , como "señora" o "coche de carreras".

2. Soluciones

En las siguientes secciones, veremos las diversas formas de verificar si una Cadena dada es un palíndromo o no.

2.1. Un enfoque simple

Podemos comenzar a iterar simultáneamente la cadena dada hacia adelante y hacia atrás, un carácter a la vez. Si hay una coincidencia, el ciclo continúa; de lo contrario, el bucle sale:

public boolean isPalindrome(String text) { String clean = text.replaceAll("\\s+", "").toLowerCase(); int length = clean.length(); int forward = 0; int backward = length - 1; while (backward > forward) { char forwardChar = clean.charAt(forward++); char backwardChar = clean.charAt(backward--); if (forwardChar != backwardChar) return false; } return true; }

2.2. Inversión de la cuerda

Hay algunas implementaciones diferentes que se ajustan a este caso de uso: podemos hacer uso de los métodos de API de las clases StringBuilder y StringBuffer al verificar palíndromos, o podemos revertir el String sin estas clases.

Echemos un vistazo a las implementaciones de código sin las API de ayuda primero:

public boolean isPalindromeReverseTheString(String text) { StringBuilder reverse = new StringBuilder(); String clean = text.replaceAll("\\s+", "").toLowerCase(); char[] plain = clean.toCharArray(); for (int i = plain.length - 1; i >= 0; i--) { reverse.append(plain[i]); } return (reverse.toString()).equals(clean); }

En el fragmento anterior, simplemente iteramos la Cadena dada desde el último carácter y agregamos cada carácter al siguiente carácter, hasta el primer carácter, invirtiendo así la Cadena dada .

Finalmente, probamos la igualdad entre la Cadena dada y la Cadena invertida .

Se podría lograr el mismo comportamiento utilizando métodos API.

Veamos una demostración rápida:

public boolean isPalindromeUsingStringBuilder(String text) { String clean = text.replaceAll("\\s+", "").toLowerCase(); StringBuilder plain = new StringBuilder(clean); StringBuilder reverse = plain.reverse(); return (reverse.toString()).equals(clean); } public boolean isPalindromeUsingStringBuffer(String text) { String clean = text.replaceAll("\\s+", "").toLowerCase(); StringBuffer plain = new StringBuffer(clean); StringBuffer reverse = plain.reverse(); return (reverse.toString()).equals(clean); }

En el fragmento de código, invocamos el método reverse () de la API StringBuilder y StringBuffer para revertir la cadena dada y probar la igualdad.

2.3. Usando Stream API

También podemos utilizar un IntStream para proporcionar una solución:

public boolean isPalindromeUsingIntStream(String text) { String temp = text.replaceAll("\\s+", "").toLowerCase(); return IntStream.range(0, temp.length() / 2) .noneMatch(i -> temp.charAt(i) != temp.charAt(temp.length() - i - 1)); }

En el fragmento de arriba, verificamos que ninguno de los pares de caracteres de cada extremo de la Cadena cumpla con la condición del predicado .

2.4. Usando recursividad

La recursividad es un método muy popular para resolver este tipo de problemas. En el ejemplo demostrado, iteramos de forma recursiva la Cadena dada y probamos para averiguar si es un palíndromo o no:

public boolean isPalindromeRecursive(String text){ String clean = text.replaceAll("\\s+", "").toLowerCase(); return recursivePalindrome(clean,0,clean.length()-1); } private boolean recursivePalindrome(String text, int forward, int backward) { if (forward == backward) { return true; } if ((text.charAt(forward)) != (text.charAt(backward))) { return false; } if (forward < backward + 1) { return recursivePalindrome(text, forward + 1, backward - 1); } return true; }

3. Conclusión

En este tutorial rápido, vimos cómo averiguar si una Cadena dada es un palíndromo o no.

Como siempre, los ejemplos de código de este artículo están disponibles en GitHub.