Ignorar mayúsculas/minúsculas y caracteres no alfabéticos en palíndromos
En el paso anterior, nuestro verificador de palíndromos funcionaba para cadenas (strings) simples como "madam" y "racecar". Sin embargo, los palíndromos del mundo real a menudo ignoran la capitalización y la puntuación. Por ejemplo, "A man, a plan, a canal: Panama" se considera un palíndromo.
En este paso, mejoraremos nuestro PalindromeChecker para manejar estos casos ignorando los caracteres no alfabéticos y tratando las letras mayúsculas y minúsculas por igual.
Abre el archivo PalindromeChecker.java en el editor del WebIDE. Modificaremos el método checkPalindrome.
Reemplaza el método checkPalindrome existente con la siguiente versión actualizada:
// Method to check if a string is a palindrome using two pointers,
// ignoring case and non-letter characters
public static boolean checkPalindrome(String str) {
// Initialize two pointers
int left = 0; // Pointer starting from the beginning
int right = str.length() - 1; // Pointer starting from the end
// Loop while the left pointer is less than the right pointer
while (left < right) {
// Move left pointer past non-letter characters
while (left < right && !Character.isLetter(str.charAt(left))) {
left++;
}
// Move right pointer past non-letter characters
while (left < right && !Character.isLetter(str.charAt(right))) {
right--;
}
// If left and right pointers haven't crossed and characters don't match (ignoring case)
if (left < right && Character.toLowerCase(str.charAt(left)) != Character.toLowerCase(str.charAt(right))) {
// If characters don't match, it's not a palindrome
return false;
}
// Move the pointers inwards
left++;
right--;
}
// If the loop completes without finding any mismatch, it's a palindrome
return true;
}
Estos son los cambios que hicimos:
- Agregamos dos bucles
while dentro del bucle principal while (left < right).
- El primer bucle
while interno (while (left < right && !Character.isLetter(str.charAt(left)))) mueve el puntero left hacia adelante siempre que esté a la izquierda del puntero right y el carácter en el puntero left no sea una letra (!Character.isLetter(...)).
- El segundo bucle
while interno (while (left < right && !Character.isLetter(str.charAt(right)))) mueve el puntero right hacia atrás siempre que esté a la izquierda del puntero right y el carácter en el puntero right no sea una letra.
- La comparación
if (left < right && Character.toLowerCase(str.charAt(left)) != Character.toLowerCase(str.charAt(right))) ahora incluye dos comprobaciones importantes:
left < right: Esto asegura que solo comparemos caracteres si los punteros no se han cruzado después de omitir los caracteres no alfabéticos.
Character.toLowerCase(...): Esto convierte ambos caracteres a minúsculas antes de compararlos, ignorando efectivamente las mayúsculas y minúsculas.
- Si los caracteres (después de convertirlos a minúsculas) no coinciden, devolvemos
false.
- Si coinciden, movemos ambos punteros hacia adentro (
left++, right--) para comprobar el siguiente par de caracteres.
Ahora, modifiquemos el método main para probar con una cadena que incluya espacios, puntuación y mayúsculas y minúsculas mezcladas. Reemplaza los casos de prueba existentes en el método main con esto:
public static void main(String[] args) {
String testString = "A man, a plan, a canal: Panama"; // A classic palindrome
boolean isPalindrome = checkPalindrome(testString);
if (isPalindrome) {
System.out.println("\"" + testString + "\" is a palindrome.");
} else {
System.out.println("\"" + testString + "\" is not a palindrome.");
}
testString = "No 'x' in Nixon"; // Another palindrome
isPalindrome = checkPalindrome(testString);
if (isPalindrome) {
System.out.println("\"" + testString + "\" is a palindrome.");
} else {
System.out.println("\"" + testString + "\" is not a palindrome.");
}
testString = "hello world"; // Not a palindrome
isPalindrome = checkPalindrome(testString);
if (isPalindrome) {
System.out.println("\"" + testString + "\" is a palindrome.");
} else {
System.out.println("\"" + testString + "\" is not a palindrome.");
}
}
Guarda el archivo PalindromeChecker.java.
Compila y ejecuta el programa actualizado en la Terminal:
javac PalindromeChecker.java
java PalindromeChecker
Ahora deberías ver la siguiente salida, identificando correctamente los palíndromos incluso con caracteres no alfabéticos y mayúsculas y minúsculas mezcladas:
"A man, a plan, a canal: Panama" is a palindrome.
"No 'x' in Nixon" is a palindrome.
"hello world" is not a palindrome.
¡Has mejorado con éxito tu verificador de palíndromos para manejar cadenas más complejas!