Ignorer la casse et les caractères non-alphabétiques dans les palindromes
Dans l'étape précédente, notre vérificateur de palindromes fonctionnait pour des chaînes simples comme "madam" et "racecar". Cependant, les palindromes du monde réel ignorent souvent la casse et la ponctuation. Par exemple, "A man, a plan, a canal: Panama" est considéré comme un palindrome.
Dans cette étape, nous allons améliorer notre PalindromeChecker
pour gérer ces cas en ignorant les caractères non-alphabétiques et en traitant les lettres majuscules et minuscules de la même manière.
Ouvrez le fichier PalindromeChecker.java
dans l'éditeur de l'IDE Web. Nous allons modifier la méthode checkPalindrome
.
Remplacez la méthode checkPalindrome
existante par la version mise à jour suivante :
// 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;
}
Voici les modifications que nous avons apportées :
- Nous avons ajouté deux boucles
while
à l'intérieur de la boucle principale while (left < right)
.
- La première boucle
while
interne (while (left < right && !Character.isLetter(str.charAt(left)))
) déplace le pointeur left
vers l'avant tant qu'il est toujours à gauche du pointeur right
et que le caractère au pointeur left
n'est pas une lettre (!Character.isLetter(...)
).
- La deuxième boucle
while
interne (while (left < right && !Character.isLetter(str.charAt(right)))
) déplace le pointeur right
vers l'arrière tant qu'il est toujours à gauche du pointeur right
et que le caractère au pointeur right
n'est pas une lettre.
- La comparaison
if (left < right && Character.toLowerCase(str.charAt(left)) != Character.toLowerCase(str.charAt(right)))
inclut maintenant deux vérifications importantes :
left < right
: Cela garantit que nous ne comparons les caractères que si les pointeurs ne se sont pas croisés après avoir sauté les caractères non-alphabétiques.
Character.toLowerCase(...)
: Cela convertit les deux caractères en minuscules avant de les comparer, ignorant ainsi la casse.
- Si les caractères (après conversion en minuscules) ne correspondent pas, nous renvoyons
false
.
- Si ils correspondent, nous déplaçons les deux pointeurs vers l'intérieur (
left++
, right--
) pour vérifier la paire de caractères suivante.
Maintenant, modifions la méthode main
pour tester avec une chaîne qui inclut des espaces, de la ponctuation et une casse mixte. Remplacez les cas de test existants dans la méthode main
par ceci :
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.");
}
}
Enregistrez le fichier PalindromeChecker.java
.
Compilez et exécutez le programme mis à jour dans le terminal :
javac PalindromeChecker.java
java PalindromeChecker
Vous devriez maintenant voir la sortie suivante, identifiant correctement les palindromes même avec des caractères non-alphabétiques et une casse mixte :
"A man, a plan, a canal: Panama" is a palindrome.
"No 'x' in Nixon" is a palindrome.
"hello world" is not a palindrome.
Vous avez réussi à améliorer votre vérificateur de palindromes pour gérer des chaînes plus complexes !