CodeGym/Blog Java/Random-ES/Programa Java para comprobar que una cadena es un palíndr...
Autor
Oleksandr Miadelets
Head of Developers Team at CodeGym

Programa Java para comprobar que una cadena es un palíndromo

Publicado en el grupo Random-ES
Algunos problemas de programación tienen el estatus de clásicos. Por lo general, este tipo de tareas están relacionadas con las matemáticas y les gusta mucho preguntar a los estudiantes de las especialidades de Ciencias de la Computación, así como a los buscadores de empleo en las entrevistas. Son buenos porque ayudan a configurar bastante bien el pensamiento de un programador, así como a entrenarlo. Uno de esos problemas es verificar si una cadena es un palíndromo, y lo consideraremos en este artículo.

Qué es un palíndromo y por qué poder buscarlos

Un palíndromo es un número, combinación de letras, palabra o texto que se lee igual en ambas direcciones. Para resumir, se puede llamar palíndromo a cualquier conjunto de caracteres que sea simétrico en su centro. La palabra proviene de raíces griegas que literalmente derivan "correr hacia atrás" (palin es "otra vez, atrás" y dromos, "correr"). Palíndromo en Java significa lo mismo que en sentido general. Ejemplos de palíndromos:
  • 1881
  • aaqquqqaa
  • estallido
  • Mediodía
  • nivel
  • rotador
  • Mi gimnasio
  • señora yo soy adam
  • ¡Ahora, señor, se ganó una guerra!
1881 es un número palíndromo y los demás son cadenas palíndromo. En este artículo, veremos los palíndromos que se representan como cadenas, pero algunos algoritmos son bastante aplicables a otros tipos de palíndromos en Java. ¿Por qué querrías buscar palíndromos? De hecho, a menudo no tenemos que buscar palíndromos en la vida cotidiana. Es una especie de tarea muy específica. Si recordamos los algoritmos de cadena, más a menudo en la práctica, los programadores pueden buscar una subcadena en una cadena y no buscar palíndromos o su número. Sin embargo, los problemas relacionados con los palíndromos tienen importantes aplicaciones. El primero es la programación de las olimpiadas. Podría haber tareas para identificar palíndromos. La segunda aplicación que es relevante para los programadores novatos es la entrevista. En una entrevista técnica, es posible que se le pida que escriba rápidamente un programa para verificar si una cadena es palíndromo, tal vez incluso en una hoja de papel. Bueno, en ciencia, la aplicación más práctica para encontrar palíndromos son los algoritmos biológicos. Según Wikipedia, la palindromicidad de los compuestos biológicos juega un papel importante en las propiedades de varios compuestos biológicos.

Ejemplo de código de algoritmo Palindrome

Pensemos. Una cadena es una secuencia de caracteres, se podría decir, una matriz de char. Lo más lógico sería seguir esta secuencia de ambos lados hacia el medio y comparar los caracteres extremos. Si hasta llegar a la mitad todos nuestros personajes coinciden, entonces tenemos un palíndromo. Vamos a crear un método booleano validPalindrome(String s) para comprobar si String es palíndromo. El código Java está aquí:
public class PalindromeTest1 {

//method to check if a string is palindrome
public static boolean validPalindrome(String s) {
       for (int i = 0, j = s.length() - 1; i < j; i++, j--) {
           if (s.charAt(i) != s.charAt(j)) {
               return false;
           }
       }
       return true;
   }

   public static void main(String[] args) {
       String s1 = "level";
       String s2 = "cool";
       String s3 = "Madam";
       String s4 = "Now, sir, a war is won!"
       boolean b1 = validPalindrome(s1);
       boolean b2 = validPalindrome(s2);
       boolean b3 = validPalindrome(s3);
       boolean b4 = validPalindrome(s4);
       System.out.println("is " + s1 + " a palindrome? " + b1);
       System.out.println("is " + s2 + " a palindrome? " + b2);
       System.out.println("is " + s3 + " a palindrome? " + b3);
       System.out.println("is " + s4 + " a palindrome? " + b4);


   }

}
En el método principal, verificamos las cadenas palindrómicas "nivel", "genial", "Señora" y "¡Ahora, señor, se ganó una guerra!". Como puedes ver, el primero, el tercero y el cuarto son palíndromos, pero el segundo no lo es. ¿Qué dará el programa?
¿Es el nivel un palíndromo? verdadero ¿Es genial un palíndromo? FALSO ¿Es la señora un palíndromo? FALSO ¡Ahora, señor, se gana una guerra! ¿un palíndromo? FALSO
Entonces, el primero es un palíndromo, el segundo no lo es. Sin embargo, ¿qué hay de malo en el tercero y el cuarto? ¿Por qué el resultado es falso ? Probablemente ya haya adivinado que el punto es que algunos caracteres en esta cadena están en mayúsculas y otros en minúsculas, y para Java M y m son dos caracteres diferentes. Mejoremos el programa para tener en cuenta esta diferencia. Aquí hay un programa para verificar si una cadena es un palíndromo que resuelve problemas de mayúsculas y minúsculas.
public class PalindromeTest2 {

   //lowercase and uppercase characters should be treated the same:
   public static boolean validPalindrome(String s) {
       for (int i = 0, j = s.length() - 1; i < j; i++, j--) {
           if (Character.toLowerCase(s.charAt(i)) != Character.toLowerCase(s.charAt(j)))
               return false;
       }
       return true;
   }

   public static void main(String[] args) {
       String s1 = "level";
       String s2 = "cool";
       String s3 = "Madam";
        String s4 = "Now, sir, a war is won!"
       boolean b1 = validPalindrome(s1);
       boolean b2 = validPalindrome(s2);
       boolean b3 = validPalindrome(s3);
       boolean b4 = validPalindrome(s4);
       System.out.println("is " + s1 + " a palindrome? " + b1);
       System.out.println("is " + s2 + " a palindrome? " + b2);
       System.out.println("is " + s3 + " a palindrome? " + b3);
       System.out.println("is " + s4 + " a palindrome? " + b4);


   }

}
Esta vez el resultado es más predecible para nosotros:
¿Es el nivel un palíndromo? verdadero ¿Es genial un palíndromo? FALSO ¿Es la señora un palíndromo? verdadero ¡Ahora, señor, se gana una guerra! ¿un palíndromo? FALSO
Bueno... no exactamente predecible. La situación con “Madam” está mejorando, pero qué pasa con nuestro largo y feliz palíndromo “¡Ahora, señor, se ganó una guerra!”. Es bastante fácil, si recuerdas que todos los espacios y signos de puntuación son iguales a las letras de Java. Así que necesitamos mejorar nuestro algoritmo nuevamente para corregir este descuido. Enseñemos a nuestro programa a ignorar los espacios y la puntuación. En pocas palabras, ignoramos todos los caracteres no alfanuméricos. Aquí está el programa Palindrome mejorado en Java.
public class PalindromeTest3 {

   //in addition to the above, ignore all non alphanumeric chars like punctuation and spaces
   private static boolean isAlphanumeric(char c) {
       return Character.isAlphabetic(c) || Character.isDigit(c);
   }

   public static boolean validPalindromeIgnorePunctuation(String s) {
       for (int i = 0, j = s.length() - 1; i < j; i++, j--) {
           // skip chars we should ignore
           while (j >= 0 && !isAlphanumeric(s.charAt(j))) j--;
           while (i < s.length() && !isAlphanumeric(s.charAt(i))) i++;
           // overskipped -> nothing left to validate
           if (i >= j) return true;

           if (Character.toLowerCase(s.charAt(i)) != Character.toLowerCase(s.charAt(j)))
               return false;
       }
       return true;
   }


   public static void main(String[] args) {
       String s1 = "level";
       String s2 = "cool";
       String s3 = "Madam";
       String s4 = "Now, sir, a war is won!";
       boolean b1 = validPalindromeIgnorePunctuation(s1);
       boolean b2 = validPalindromeIgnorePunctuation(s2);
       boolean b3 = validPalindromeIgnorePunctuation(s3);
       boolean b4 = validPalindromeIgnorePunctuation(s4);
       System.out.println("is " + s1 + " a palindrome? " + b1);
       System.out.println("is " + s2 + " a palindrome? " + b2);
       System.out.println("is " + s3 + " a palindrome? " + b3);
       System.out.println("is " + s4 + " a palindrome? " + b4);


   }

}
Al menos el resultado es el que esperábamos de él:
¿Es el nivel un palíndromo? verdadero ¿Es genial un palíndromo? FALSO ¿Es la señora un palíndromo? verdadero ¡Ahora, señor, se gana una guerra! ¿un palíndromo? verdadero
Quizás, si recién está comenzando a programar, le resulte difícil comprender cómo funcionan los algoritmos de comparación y de recorrido de cadenas. Por supuesto, es mejor lidiar con esto, pero puede escribir una versión simplificada del mismo pasaje a través de la matriz de caracteres, que de hecho es una cadena. Puede usar el método StringBuffer.reverse para verificar si una cadena es un palíndromo. Hagamos la versión más simple sin buscar símbolos no alfanuméricos y mayúsculas y minúsculas.
public class PalindromeTest5 {

   public static boolean validPalindrome(String s) {

       StringBuffer buffer = new StringBuffer(s);
       buffer.reverse();
       String data = buffer.toString();

       if (s.equals(data)) {
           return true;
       }
       return false;
   }
   public static void main(String[] args) {
       String s1 = "level";
       String s2 = "cool";
       String s3 = "Madam";
       String s4 = "Now, sir, a war is won!";
       boolean b1 = validPalindrome(s1);
       boolean b2 = validPalindrome(s2);
       boolean b3 = validPalindrome(s3);
       boolean b4 = validPalindrome(s4);
       System.out.println("is " + s1 + " a palindrome? " + b1);
       System.out.println("is " + s2 + " a palindrome? " + b2);
       System.out.println("is " + s3 + " a palindrome? " + b3);
       System.out.println("is " + s4 + " a palindrome? " + b4);


   }
}
El resultado es el mismo que en el primer ejemplo.
¿Es el nivel un palíndromo? verdadero ¿Es genial un palíndromo? FALSO ¿Es la señora un palíndromo? FALSO ¡Ahora, señor, se gana una guerra! ¿un palíndromo? FALSO
Si lo desea, puede mejorar este programa como hicimos con el primer ejemplo. Para reforzar lo que aprendió, le sugerimos que vea una lección en video de nuestro Curso de Java
Comentarios
  • Populares
  • Nuevas
  • Antiguas
Debes iniciar sesión para dejar un comentario
Esta página aún no tiene comentarios