Comprobando palíndromos en Java

JavaJavaBeginner
Practicar Ahora

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

En este laboratorio, aprenderemos a verificar si una cadena es un palíndromo o no en Java. Un palíndromo es una cadena que se lee igual de adelante hacia atrás y de atrás hacia adelante.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL java(("Java")) -.-> java/BasicSyntaxGroup(["Basic Syntax"]) java(("Java")) -.-> java/StringManipulationGroup(["String Manipulation"]) java(("Java")) -.-> java/DataStructuresGroup(["Data Structures"]) java(("Java")) -.-> java/ProgrammingTechniquesGroup(["Programming Techniques"]) java(("Java")) -.-> java/FileandIOManagementGroup(["File and I/O Management"]) java(("Java")) -.-> java/SystemandDataProcessingGroup(["System and Data Processing"]) java/BasicSyntaxGroup -.-> java/booleans("Booleans") java/BasicSyntaxGroup -.-> java/for_loop("For Loop") java/BasicSyntaxGroup -.-> java/while_loop("While Loop") java/StringManipulationGroup -.-> java/strings("Strings") java/DataStructuresGroup -.-> java/arrays_methods("Arrays Methods") java/ProgrammingTechniquesGroup -.-> java/recursion("Recursion") java/FileandIOManagementGroup -.-> java/stream("Stream") java/SystemandDataProcessingGroup -.-> java/string_methods("String Methods") subgraph Lab Skills java/booleans -.-> lab-117978{{"Comprobando palíndromos en Java"}} java/for_loop -.-> lab-117978{{"Comprobando palíndromos en Java"}} java/while_loop -.-> lab-117978{{"Comprobando palíndromos en Java"}} java/strings -.-> lab-117978{{"Comprobando palíndromos en Java"}} java/arrays_methods -.-> lab-117978{{"Comprobando palíndromos en Java"}} java/recursion -.-> lab-117978{{"Comprobando palíndromos en Java"}} java/stream -.-> lab-117978{{"Comprobando palíndromos en Java"}} java/string_methods -.-> lab-117978{{"Comprobando palíndromos en Java"}} end

Usando dos punteros para comprobar palíndromos

El primer método que implementaremos es el enfoque de dos punteros. Crearemos un método llamado isPalindrome que toma una cadena como entrada y devuelve un valor booleano que indica si la cadena es un palíndromo o no.

public class PalindromeChecker {
    public static boolean isPalindrome(String str) {
        int start = 0;
        int end = str.length() - 1;

        while (start < end) {
            char startChar = Character.toLowerCase(str.charAt(start));
            char endChar = Character.toLowerCase(str.charAt(end));

            if (startChar!= endChar) {
                return false;
            }

            start++;
            end--;
        }

        return true;
    }
}

El método isPalindrome utiliza dos punteros, start y end, que comienzan respectivamente desde el principio y el final de la cadena. El bucle se ejecuta hasta que los dos punteros se encuentren en el medio.

En cada iteración, comparamos los caracteres en los punteros start y end. Si no son iguales, devolvemos false. Si lo son, actualizamos los punteros para comprobar el siguiente conjunto de caracteres en la cadena.

Para probar nuestro método, podemos agregar un método principal y llamar al método isPalindrome con varias cadenas de entrada.

public class PalindromeChecker {
    public static boolean isPalindrome(String str) {
        // Implementación del método isPalindrome
    }

    public static void main(String[] args) {
        System.out.println("¿Es 'racecar' un palíndromo? " + isPalindrome("racecar"));
        System.out.println("¿Es 'hello' un palíndromo? " + isPalindrome("hello"));
    }
}

Usando recursión para comprobar palíndromos

El siguiente método que implementaremos es el enfoque recursivo. Crearemos un nuevo método llamado isPalindromeRecursive que toma la cadena, el índice de inicio y el índice de fin como entrada.

public class PalindromeChecker {
    public static boolean isPalindrome(String str) {
        String lowercaseStr = str.toLowerCase();
        return isPalindromeRecursive(lowercaseStr, 0, lowercaseStr.length() - 1);
    }

    public static boolean isPalindromeRecursive(String str, int start, int end) {
        if(start >= end) {
            return true;
        }

        char startChar = Character.toLowerCase(str.charAt(start));
        char endChar = Character.toLowerCase(str.charAt(end));

        if(startChar!= endChar) {
            return false;
        }

        return isPalindromeRecursive(str, start + 1, end - 1);
    }

    public static void main(String[] args) {
        // Tests for isPalindrome and isPalindromeRecursive methods
    }
}

El método isPalindromeRecursive utiliza recursión para comprobar si la cadena es un palíndromo o no. Tenemos dos casos base:

  1. Si el índice start es mayor o igual que el índice end, significa que hemos comprobado todos los caracteres de la cadena y coinciden, entonces devolvemos true.
  2. Si los caracteres en los índices start y end no son iguales, devolvemos false.

Si ninguno de los casos base se cumple, llamamos a isPalindromeRecursive nuevamente con los índices actualizados.

Ahora podemos probar nuestro método recursivo llamándolo dentro del método main.

public class PalindromeChecker {
    public static boolean isPalindrome(String str) {
        // Implementación del método isPalindrome
    }

    public static boolean isPalindromeRecursive(String str, int start, int end) {
        // Implementación del método isPalindromeRecursive
    }

    public static void main(String[] args) {
        System.out.println("¿Es 'racecar' un palíndromo? " + isPalindromeRecursive("racecar", 0, 6));
        System.out.println("¿Es 'hello' un palíndromo? " + isPalindromeRecursive("hello", 0, 4));
    }
}

Volteando la cadena para comprobar palíndromos

El último método que implementaremos es el enfoque de voltear la cadena. Crearemos un nuevo método llamado isPalindromeReverse que toma una cadena como entrada.

public class PalindromeChecker {
    public static boolean isPalindrome(String str) {
        // Implementación del método isPalindrome
    }

    public static boolean isPalindromeRecursive(String str, int start, int end) {
        // Implementación del método isPalindromeRecursive
    }

    public static boolean isPalindromeReverse(String str) {
        String reversed = "";

        for (int i = str.length() - 1; i >= 0; i--) {
            reversed += str.charAt(i);
        }

        return str.equalsIgnoreCase(reversed);
    }

    public static void main(String[] args) {
        // Tests for isPalindrome and isPalindromeRecursive methods
        System.out.println("¿Es 'racecar' un palíndromo? " + isPalindromeReverse("racecar"));
        System.out.println("¿Es 'hello' un palíndromo? " + isPalindromeReverse("hello"));
    }
}

El método isPalindromeReverse crea una nueva cadena llamada reversed y la llena iterando a través de la cadena de entrada desde el final hasta el principio. Luego devolvemos true si las dos cadenas son iguales ignorando mayúsculas y minúsculas.

Podemos probar el método agregando una llamada a isPalindromeReverse en el método main.

Usando Java Streams para comprobar palíndromos

Finalmente, usaremos la API de Java Streams para comprobar palíndromos. Crearemos un nuevo método llamado isPalindromeStream que toma una cadena como entrada.

import java.util.stream.IntStream;

public class PalindromeChecker {
    public static boolean isPalindrome(String str) {
        // Implementación del método isPalindrome
    }

    public static boolean isPalindromeRecursive(String str, int start, int end) {
        // Implementación del método isPalindromeRecursive
    }

    public static boolean isPalindromeReverse(String str) {
        // Implementación del método isPalindromeReverse
    }

    public static boolean isPalindromeStream(String str) {
        String lowercaseStr = str.toLowerCase();

        return IntStream.range(0, lowercaseStr.length() / 2)
             .noneMatch(i -> lowercaseStr.charAt(i)!= lowercaseStr.charAt(lowercaseStr.length() - i - 1));
    }

    public static void main(String[] args) {
        // Tests for isPalindrome and isPalindromeRecursive methods
        System.out.println("¿Es 'racecar' un palíndromo? " + isPalindromeStream("racecar"));
        System.out.println("¿Es 'hello' a palindrome? " + isPalindromeStream("hello"));
    }
}

El método isPalindromeStream utiliza la clase IntStream para generar un rango de índices que podemos usar para comparar los caracteres en la cadena.

Usamos el método noneMatch para devolver true si ninguno de los caracteres viola la condición de que el ith y el n - i - 1th caracteres son iguales, donde n es la longitud de la cadena y i es el índice.

Podemos probar el método agregando una llamada a isPalindromeStream en el método main.

Resumen

En este laboratorio, aprendimos cómo comprobar si una cadena dada es un palíndromo o no en Java. Implementamos cuatro métodos diferentes para realizar esta tarea:

  1. Enfoque de dos punteros
  2. Enfoque recursivo
  3. Enfoque de voltear la cadena
  4. Enfoque de Java Streams

Ahora que entiendes estos métodos, ¡puedes utilizarlos para resolver problemas más complejos!