Groß- und Kleinschreibung sowie Nicht-Buchstaben bei Palindromprüfung ignorieren
Im vorherigen Schritt hat unser Palindromprüfer für einfache Strings wie "madam" und "racecar" funktioniert. In der realen Welt werden bei Palindromen jedoch oft Groß- und Kleinschreibung sowie Satzzeichen ignoriert. Beispielsweise wird "A man, a plan, a canal: Panama" als Palindrom betrachtet.
In diesem Schritt werden wir unseren PalindromeChecker
erweitern, um diese Fälle zu behandeln, indem wir Nicht-Buchstaben ignorieren und Groß- und Kleinbuchstaben gleich behandeln.
Öffnen Sie die Datei PalindromeChecker.java
im WebIDE-Editor. Wir werden die Methode checkPalindrome
ändern.
Ersetzen Sie die vorhandene checkPalindrome
-Methode durch die folgende aktualisierte Version:
// 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;
}
Hier sind die Änderungen, die wir vorgenommen haben:
- Wir haben zwei
while
-Schleifen innerhalb der Haupt-while (left < right)
-Schleife hinzugefügt.
- Die erste innere
while
-Schleife (while (left < right && !Character.isLetter(str.charAt(left)))
) bewegt den left
-Zeiger vorwärts, solange er noch links vom right
-Zeiger ist und das Zeichen am left
-Zeiger kein Buchstabe ist (!Character.isLetter(...)
).
- Die zweite innere
while
-Schleife (while (left < right && !Character.isLetter(str.charAt(right)))
) bewegt den right
-Zeiger rückwärts, solange er noch links vom right
-Zeiger ist und das Zeichen am right
-Zeiger kein Buchstabe ist.
- Der Vergleich
if (left < right && Character.toLowerCase(str.charAt(left)) != Character.toLowerCase(str.charAt(right)))
beinhaltet jetzt zwei wichtige Prüfungen:
left < right
: Dies stellt sicher, dass wir nur Zeichen vergleichen, wenn die Zeiger nach dem Überspringen von Nicht-Buchstaben nicht übereinandergelaufen sind.
Character.toLowerCase(...)
: Dies wandelt beide Zeichen in Kleinbuchstaben um, bevor sie verglichen werden, wodurch die Groß- und Kleinschreibung effektiv ignoriert wird.
- Wenn die Zeichen (nach der Umwandlung in Kleinbuchstaben) nicht übereinstimmen, geben wir
false
zurück.
- Wenn sie übereinstimmen, bewegen wir beide Zeiger nach innen (
left++
, right--
), um das nächste Zeichenpaar zu prüfen.
Jetzt ändern wir die main
-Methode, um mit einem String zu testen, der Leerzeichen, Satzzeichen und gemischte Groß- und Kleinschreibung enthält. Ersetzen Sie die vorhandenen Testfälle in der main
-Methode durch Folgendes:
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.");
}
}
Speichern Sie die Datei PalindromeChecker.java
.
Kompilieren und führen Sie das aktualisierte Programm im Terminal aus:
javac PalindromeChecker.java
java PalindromeChecker
Sie sollten jetzt die folgende Ausgabe sehen, die die Palindrome auch bei Nicht-Buchstaben und gemischter Groß- und Kleinschreibung korrekt identifiziert:
"A man, a plan, a canal: Panama" is a palindrome.
"No 'x' in Nixon" is a palindrome.
"hello world" is not a palindrome.
Sie haben Ihren Palindromprüfer erfolgreich erweitert, um komplexere Strings zu behandeln!