Ein Palindrom ist ein Wort, eine Phrase, eine Zahl oder eine andere Folge von Einheiten, die in beide Richtungen gleich gelesen werden können.
Um zu überprüfen, ob ein Wort ein Palindrom ist, erhalte ich das Zeichenarray des Wortes und vergleiche die Zeichen. Ich habe es getestet und es scheint zu funktionieren. Ich möchte jedoch wissen, ob es richtig ist oder ob es etwas zu verbessern gibt.
Hier ist mein Code:
public class Aufg1 {
public static void main(String[] args) {
String wort = "reliefpfpfeiller";
char[] warray = wort.toCharArray();
System.out.println(istPalindrom(warray));
}
public static boolean istPalindrom(char[] wort){
boolean palindrom = false;
if(wort.length%2 == 0){
for(int i = 0; i < wort.length/2-1; i++){
if(wort[i] != wort[wort.length-i-1]){
return false;
}else{
palindrom = true;
}
}
}else{
for(int i = 0; i < (wort.length-1)/2-1; i++){
if(wort[i] != wort[wort.length-i-1]){
return false;
}else{
palindrom = true;
}
}
}
return palindrom;
}
}
Antworten:
Warum nicht einfach:
Beispiel:
Eingabe ist "andna".
i1 ist 0 und i2 ist 4.
Erste Schleifeniteration werden wir vergleichen
word[0]
undword[4]
. Sie sind gleich, also erhöhen wir i1 (es ist jetzt 1) und verringern i2 (es ist jetzt 3).Also vergleichen wir dann die n. Sie sind gleich, also erhöhen wir i1 (es ist jetzt 2) und verringern i2 (es ist 2).
Jetzt sind i1 und i2 gleich (beide sind 2), daher ist die Bedingung für die while-Schleife nicht mehr wahr, sodass die Schleife endet und wir true zurückgeben.
quelle
Sie können überprüfen, ob eine Zeichenfolge ein Palindrom ist, indem Sie sie mit der Umkehrung ihrer selbst vergleichen:
oder für Java-Versionen vor 1.5,
EDIT: @FernandoPelliccioni lieferte eine sehr gründliche Analyse der Effizienz (oder des Fehlens) dieser Lösung in Bezug auf Zeit und Raum. Wenn Sie an der rechnerischen Komplexität dieser und anderer möglicher Lösungen für diese Frage interessiert sind, lesen Sie sie bitte!
quelle
Eine prägnante Version, bei der eine Reihe von Objekten nicht (ineffizient) initialisiert wird:
quelle
Alternativ Rekursion .
Für alle, die nach einer kürzeren rekursiven Lösung suchen, um zu überprüfen, ob eine bestimmte Zeichenfolge als Palindrom erfüllt:
ODER noch kürzer , wenn Sie möchten:
quelle
return s.charAt(0) == s.charAt(l - 1) && isPalindrome(s.substring(1, l - 1));
Los, Java:
quelle
auch eine anders aussehende Lösung:
quelle
Und hier eine komplette Java 8- Streaming- Lösung. Ein IntStream liefert alle Indizes bis zu Strings halber Länge, und dann wird ein Vergleich von Anfang bis Ende durchgeführt.
Ausgabe ist:
quelle
allMatch
mitallMatch(i -> str.charAt(i) == str.charAt(str.length() - i - 1))
?quelle
isPalindrome()
mit"cbb"
?}}
quelle
Ich arbeitete an einer Lösung für eine Frage, die als Duplikat dieser Frage markiert war. Könnte es auch hier werfen ...
Die Frage verlangte eine einzige Zeile, um dies zu lösen, und ich nahm sie eher als literarisches Palindrom - also können Leerzeichen, Interpunktion und Groß- / Kleinschreibung das Ergebnis beeinträchtigen.
Hier ist die hässliche Lösung mit einer kleinen Testklasse:
Tut mir leid, dass es irgendwie böse ist - aber die andere Frage spezifizierte einen Einzeiler.
quelle
Wenn Sie das Palindrom auf die erste Hälfte der Saite mit dem Rest prüfen, wird davon ausgegangen, dass alle Leerzeichen entfernt werden.
quelle
Ich bin neu in Java und nehme Ihre Frage als Herausforderung an, um mein Wissen zu verbessern.
quelle
Probieren Sie es aus:
quelle
quelle
Eine andere Möglichkeit ist die Verwendung von char Array
}}
quelle
Hier meine Analyse der @ Greg-Antwort: componentsprogramming.com/palindromes
Nebenbemerkung: Aber für mich ist es wichtig, dies generisch zu tun . Die Anforderungen sind, dass die Sequenz bidirektional iterierbar ist und die Elemente der Sequenz unter Verwendung von Gleichheit vergleichbar sind. Ich weiß nicht, wie man es in Java macht, aber hier ist eine C ++ - Version, ich kenne keinen besseren Weg, um es für bidirektionale Sequenzen zu machen.
Komplexität: lineare Zeit,
Wenn ich RandomAccessIterator bin: Floor (n / 2) Vergleiche und Floor (n / 2) * 2 Iterationen
Wenn ich BidirectionalIterator bin: Etagenvergleiche (n / 2) und Etagenvergleiche (n / 2) * 2 Iterationen plus (3/2) * n Iterationen, um die mittlere (mittlere Funktion) zu finden
Lagerung: O (1)
Kein Dymamus zugewiesener Speicher
quelle
Kürzlich habe ich ein Palindrom-Programm geschrieben, das StringBuilder nicht verwendet. Eine späte Antwort, aber dies könnte für einige Leute nützlich sein.
quelle
Mit Stack kann das so gemacht werden
quelle
quelle
Erstaunlich, wie viele verschiedene Lösungen für ein so einfaches Problem existieren! Hier ist ein anderes.
quelle
quelle
Warum nicht einfach:
quelle
quelle
quelle
Ich suchte nach einer Lösung, die nicht nur für Palindrome wie ...
... aber auch für ...
Iterativ : Dies hat sich als gute Lösung erwiesen.
Rekursiv . Ich denke, diese Lösung sollte nicht viel schlimmer sein als die iterative. Ist ein bisschen beschissen, müssen wir den Reinigungsschritt aus der Methode herausziehen, um unnötiges Verarbeiten zu vermeiden.
Umkehren : Dies hat sich als teure Lösung erwiesen.
Alle Credits an die Jungs, die in diesem Beitrag antworten und Licht in das Thema bringen.
quelle
Betrachtet man keine Buchstaben in den Wörtern
———
quelle
Hier können Sie Palindrom eine Reihe von Zeichenfolgen dynamisch überprüfen
quelle
IMO, der rekursive Weg ist der einfachste und klarste.
quelle
Hier wird nach dem größten Palindrom in einer Zeichenfolge gesucht, immer beginnend mit dem 1. Zeichen.
quelle
Code-Auszug:
quelle