# Überprüfen ob Palindrom



## JavaIsTheBest (29. Mrz 2016)

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.


```
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 (29. Mrz 2016)

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 (29. Mrz 2016)

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:

```
...
if(s.charAt(i)!=s.charAt(n-i-1))
...
```

edit: zu langsam^^


----------



## Meniskusschaden (29. Mrz 2016)

JavaIsTheBest hat gesagt.:


> *if*(s.charAt(i)!=s.charAt(--n)){ _//Warum nicht s.charAt(i).equals(s.charAt(--n))_


Hier werden keine Strings verglichen, sondern einzelne Zeichen. Die sind vom Typ char und somit primitive Datentypen, die man wie beispielsweise int-Variablen mit dem Gleichheitszeichen vergleichen kann.


----------



## Viktim (29. Mrz 2016)

Du könntest das ganze viel leichter machen  gut dir das hier mal an:

```
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


----------



## Flown (29. Mrz 2016)

@Viktim verwende doch den richtigen Comparator, dann sparst du dir ein paar `String::toLowerCase`.

```
public static boolean isPalindrome1(String s) {
  Objects.requireNonNull(s);
  String trimmed = s.trim();
  return trimmed.equalsIgnoreCase(new StringBuilder(trimmed).reverse().toString());
}
```


----------



## Viktim (29. Mrz 2016)

Flown hat gesagt.:


> @Viktim verwende doch den richtigen Comparator, dann sparst du dir ein paar String::toLowerCase.


Ich wusste garnicht, dass es das gibt, danke


----------

