Überprüfen ob Palindrom

JavaIsTheBest

Bekanntes Mitglied
Hallo,
Meine Palindrom Funktion funktioniert nur für bestimmte Strings. Bei dem String abaa kommt z.B. true raus, was nicht sein sollte.
Wo liegt hier der Fehler? Ich bin den Code mehrmals drübergegangen aber den Fehler hab ich nicht gefunden.

Java:
public static boolean isGeneralizedPalindrome(String s){ //abaa funktioniert z.B. nicht
        s=trim(s);
        int n=s.length();
        for(int i=0;i<n/2;i++){
            if(s.charAt(i)!=s.charAt(--n)){ //Warum nicht s.charAt(i).equals(s.charAt(--n))
                return false;
            }
            n--;
        }
        return true;
    }
 

Meniskusschaden

Top Contributor
Erstes Problem: du dekrementierst n bei jedem Schleifendurchlauf zwei Mal.

Zweites Problem: du benutzt n im Abbruchkriterium deiner Schleife und veränderst es im Schleifenkörper. Wenn n nach dem ersten Schleifendurchlauf den Wert 3 hätte (bei dir fälschlicherweise sogar 2) ergibt sich für n/2 der Wert 1, weil es sich um eine Ganzzahldivision handelt. Es würde also bereits bei der Beendigungsprüfung des zweiten Durchlaufs i=1=n/2 gelten.
 

InfectedBytes

Top Contributor
in jedem Durchlauf reduzierst du n, allerdings ist n/2 auch deine Abbruchbedingung. Bei abaa ist n zu beginn 4, nach einem Schleifendurchlauf ist es durch --n jedoch nur noch 3 => Deine Abbruch bedingung stimmt schon nicht mehr, da nun n/2 nur noch 1 ist und nicht mehr 2.
Lösung:
Entweder eine zweite Zählvariable und n eben nicht mehr verändern oder z.b. anstatt --n einfach n-i-1 verwenden:
Java:
...
if(s.charAt(i)!=s.charAt(n-i-1))
...

edit: zu langsam^^
 

Viktim

Bekanntes Mitglied
Du könntest das ganze viel leichter machen ;) gut dir das hier mal an:
Java:
String wortUmgekehrt = new StringBuilder(wort.toLowerCase()).reverse().toString();
if wortUmgekehrt.equals(wort.toLowerCase())) {
}
oder wenigstens verständlicher für Leute mit wenig Ahnung wie Ich :D
 

Flown

Administrator
Mitarbeiter
@Viktim verwende doch den richtigen Comparator, dann sparst du dir ein paar String::toLowerCase.
Java:
public static boolean isPalindrome1(String s) {
  Objects.requireNonNull(s);
  String trimmed = s.trim();
  return trimmed.equalsIgnoreCase(new StringBuilder(trimmed).reverse().toString());
}
 

Neue Themen


Oben