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!