Palindrom ermitteln

Hallo1234

Bekanntes Mitglied
Hallo,
wie schaffte ich es, auf die letzte Stelle eines Wortes zu zugreifen, um überprüfen zu können, ob es ein Palindrom ist?
Hier ist mein Ansatz bisher:
Java:
public static String findePalindrome() {
        Scanner s = new Scanner(System.in);
        
        System.out.println("Geben Sie ein Wort ein: ");
        
        String wort = s.next();
        
        for(int i=1; i<wort.length(); i++) {
        if(wort.charAt(0)==wort.charAt(i)) {
            System.out.println("test");
        }
        }
        
        return wort;
    }

Der Code ist offensichtlich noch nicht fertig. Könnte mir jemand dazu einen Tipp geben?
Vielen Dank
 
Du hast doch schon charAt und Du weißt, wie man die Länge des Worts ermittelt. Damit sollte doch klar sein, wie Du auf den letzten Buchstaben des Wortes zugreifen kannst, oder?
 
Ja, stimmt.
Java:
if(wort.charAt(0)==wort.charAt(wort.length()-1)) {
            System.out.println("test");
        }

Habs jetzt, danke. Geht sogar ohne for-Schleife 🙂
 
Okay, jetzt habe ich doch noch eine Frage.
Der Code funktionierte. Als ich dann den Boolean eingesetzt habe, damit der Satz nicht immer 5 Mal durch die for-Schleife ausgegeben wird, wurde plötzlich für jedes Wort der Satz ausgegeben, auch wenn es kein Palindrom ist. Woran liegt das? Ich verstehe es nicht.
Java:
    public static String findePalindrome() {
        Scanner s = new Scanner(System.in);
        
        System.out.println("Geben Sie ein Wort ein: ");
        
        boolean isPal = false;
        
        String wort = s.next();
        
        for(int i=0; i<wort.length(); i++) {
            if(wort.charAt(i)==wort.charAt(wort.length()-(i+1))) {
                isPal = true;
        }
    }
        if(isPal == true) {
            System.out.println("Das Wort "+ wort +" ist ein Palindrom.");
        }
        
        return wort;
    }

Vielen Dank
 
Ja, das erste und das letzte Zeichen geht ohne Schleife. Um festzustellen, ob ein Wort ein Palindrom ist, wirst Du um eine Wiederholung nicht herumkommen.
 
So müsste es doch eigentich funktionieren oder?
Wo liegt der Fehler?
Java:
public static String findePalindrome() {
        Scanner s = new Scanner(System.in);
      
        System.out.println("Geben Sie ein Wort ein: ");
      
        boolean isPal = false;
      
        String wort = s.next();
      
        int laenge = wort.length();
      
        for(int i=0; i<wort.length(); i++) {
            if(wort.charAt(wort.length()-(laenge+i))==wort.charAt(wort.length()-(i+1))) {
                //isPal = true;
                System.out.println("Es ist Pal");
        }
    }
        /*if(isPal == true) {
            System.out.println("Das Wort "+ wort +" ist ein Palindrom.");
        }*/
      
        return wort;
    }
Nachtrag: mir ist jetzt auch aufgefallen, dass es so nicht funktionieren kann. Sobald zwei Buchstaben im Wort gleich sind, wird er den Satz ausgeben. Wie schaffe ich es, dass alle Buchstaben überprüft werden?

Nachtrag1: mit else if funktioniert es. Nun bekomme ich aber eine Fehlermeldung: outOfBounds.
Java:
    public static String findePalindrome() {
        Scanner s = new Scanner(System.in);
        
        System.out.println("Geben Sie ein Wort ein: ");
        
        boolean isPal = false;
        
        String wort = s.next();
        
        int laenge = wort.length();
        
        for(int i=0; i<wort.length(); i++) {
            if(wort.charAt(wort.length()-(laenge+i))==wort.charAt(wort.length()-(i+1))) {
                //isPal = true;
                System.out.println("Es ist Pal");
        }else if(wort.charAt(wort.length()-(laenge+i))!=wort.charAt(wort.length()-(i+1))) {
            System.out.println("Kein Pal");
        }
    }
        /*if(isPal == true) {
            System.out.println("Das Wort "+ wort +" ist ein Palindrom.");
        }*/
        
        return wort;
    }
 
Zuletzt bearbeitet:
Nein, nein, der Code in #4 war schon gar nicht sooo verkehrt. Du musst nur die Logik umdrehen: ein Wort ist so lange ein Palindrom, so lange von vorne und hinten gesehen (in jeder Iteration) die gleichen Buchstaben stehen. Sobald einmal ein Unterschied auftritt, ist es kein Palindrom mehr. Klar?
 
Java:
    public static boolean palindrom(String s) {
        for (int x = 0, y = s.length() - 1; x < y; x++, y--) {
            if (s.charAt(x) != s.charAt(y)) {
                return false;
            }
        }
        return true;
    }

    public static void main(String[] args) {
        @SuppressWarnings("resource")
        Scanner scanner = new Scanner(System.in);
        while (true) {
            System.out.println("Gib nen Wort ein, das auf Palindrome hin untersucht wird:");
            String s = scanner.nextLine();
            if (s == null || s.isBlank()) {
                return;
            }
            System.out.println(palindrom(s));
        }
    }
 
Danke für eure Hilfe. Ich glaube, ich habs jetzt.
Java:
    public static String findePalindrome() {
        Scanner s = new Scanner(System.in);
        
        System.out.println("Geben Sie ein Wort ein: ");
        
        boolean isPal = false;
        
        String wort = s.next();
        
        int laenge = wort.length();
        
        for(int i=0; i<wort.length(); i++) {
            if(wort.charAt(i)!=wort.charAt(wort.length()-(i+1))) {
                isPal = false;
                }else {
                    isPal = true;
            }
    }
        if(isPal == false) {
            System.out.println("Das Wort '"+ wort +"' ist kein Palindrom.");
    }else if(isPal == true) {
        System.out.println("Das Wort '"+wort +"' ist ein Palindrom.");
    }
        return wort;
}
 
Bei so Aufgaben ist das Pattern immer gleich:
a) Sinnvollen Anfangszustand setzen
b) dann alles testen und ggf. Zustand umsetzen. (Optional Schleife noch verlassen)

Dabei wird der Zustand und die Bedingung so gewählt, dass eine Abweichung ausreichend. Ein Palindrom liegt nicht vor, wenn eine zu prüfenden Kombination nicht gleich ist.

Sowas ist generell am einfachsten in eine separaten Methode zu testen. Dann hast du nur die Schleife und wenn die Bedingung zutrifft, dann gibst du direkt das Ergebnis zurück. Ansonsten kommt nach der Schleife die Rückgabe. (Siehe #9)

Es ist bei diesem Pattern immer falsch, den Status immer zu setzen - dabei hast du ja nur noch den letzten check, denn das Ergebnis wird ja immer überschrieben ...

Bezüglich des Algorithmus hier bedeutet das z.B.:
Du gehst davon aus, dass ein Wort ein Palindrom ist. Dann prüfst du die Paare und wenn ein Paar nicht passt, dann änderst du das Ergebnis auf: kein Palindrom.
 
Vielen Dank für eure Hilfe und Bemühungen, aber ich komme einfach nicht drauf.
Den Fehler habe ich erkannt, sobald der erste und letzte Buchstabe gleich sind, ist isPal true, allerdings habe ich keine Ahnung, wie das zu beheben ist. So sieht es bis jetzt aus:
Java:
public static String findePalindrome() {
        Scanner s = new Scanner(System.in);

        System.out.println("Geben Sie ein Wort ein: ");

        boolean isPal = false;
        
        String wort = s.next();

        isPal = pruefePal(isPal, wort);

        if(isPal == false) {
            System.out.println("Das Wort '"+ wort +"' ist kein Palindrom.");
        }else if(isPal == true) {
            System.out.println("Das Wort '"+wort +"' ist ein Palindrom.");
        }
        return wort;
    }

    public static boolean pruefePal(boolean isPal, String wort) {
        
        for(int i=0; i<wort.length(); i++) {
            if(wort.charAt(0)==wort.charAt(wort.length()-(i+1))) {
                isPal = true;
            }else if (wort.charAt(i)!=wort.charAt(wort.length()-(i+1))){
                isPal = false;
            }
        }
        return isPal;
    }
 
Fangen wir nochmal von vorne an: ein Palindrom ist hier ein Wort, das von vorne und hinten gelesen den gleichen Text ergibt.

Wir gehen erstmal davon aus, dass ein gegebenes Wort ein Palindrom ist und zwar bis das Gegenteil bewiesen ist. Jetzt versuchen wir, das Gegenteil zu beweisen, indem wir mit einer Schleife über die Buchstaben iterieren. Da wir in jeder Iteration einen Buchstaben aus der "linken" Hälfte und einen Buchstaben aus der "rechten" Hälfte miteinander vergleichen, brauchen (und sollten) wir den Index nur bis zur Mitte des Worts laufen zu lassen. Außerdem können und müssen wir die Iteration abbrechen, sobald bei einem Vergleich ein Unterschied festgestellt wurde, denn dann befinden wir uns an der Stelle im Wort, an der bewiesen ist, dass das Wort kein Palindrom ist.

Den Abbruch der Schleife können wir unterschiedlich erledigen: bei einer Methode, die ein boolean zurückgibt, können wir einfach per return false aus der Methode zurückkehren. Ansonsten gibt es natürlich die Möglichkeit, per break; die Schleife abzubrechen. Außerdem ließe sich mit einer boolean-Variable und einer geeigneten Schleifenbedingung die Schleife gewöhnlich terminieren.

Möglichkeit mit return:
Java:
    public static boolean pruefePal(String wort) {
        int n = wort.length() / 2;
        for(int i=0; i<n; i++) {
            if(wort.charAt(i) != wort.charAt(wort.length()-(i+1))) {
                return false;
            }
        }
        return true;
    }

Möglichkeit mit break:
Java:
    public static boolean pruefePal(String wort) {
        boolean result = true;
        int n = wort.length() / 2;
        for(int i=0; i<n; i++) {
            if(wort.charAt(i) != wort.charAt(wort.length()-(i+1))) {
                result = false;
                break;
            }
        }
        return result;
    }

Möglichkeit über die Schleifenbedingung:
Java:
    public static boolean pruefePal(String wort) {
        boolean palindromeSoFar = true;
        int n = wort.length() / 2;
        for(int i=0; palindromeSoFar && i<n; i++) {
            palindromeSoFar = (wort.charAt(i) == wort.charAt(wort.length() - 1 - i));
        }
        return palindromeSoFar;
    }

Aufgabe für Dich: versuche, die Codes zu verstehen und an den Wortlängen 4 und 5 nachzuvollziehen, warum n/2 ok ist.
 
Super, jetzt funktioniert es. Das n/2 bildet so zu sagen eine Trennwand bei der Hälfte des Wortes. So wird die eine Hälfte mit der anderen abgeglichen und es wird true oder false ausgegeben, je nachdem ob die Buchstaben gleich sind. Außerdem unterscheidet man so zwischen gerader und ungerader Wortlänge. Falls ein Wort 5 Buchstaben hat, ist es trotzdem nur nötig, bis zum 2 Buchstaben zu prüfen, weil der mittlere keinen "Partner" hat. War das soweit korrekt?
Ich danke Dir für die ausführliche Erklärung 🙂
 
Ja, vollkommen richtig. Schau Dir auch die kleinen aber feinen Unterschiede zu Deinem Code an; wichtig wäre, dass Du (für Dich) die Gedankenfehler erkennst.
 
Juhu, danke. Ja, daran muss ich arbeiten. Am besten schreibe ich hinter jede Zeile einen Kommentar, den die Funktion des Codes beschreibt, dann wird es klarer.
 

Neue Themen


Zurück
Oben