zB "ccddcc" in der Zeichenfolge "abaccddccefe"
Ich dachte an eine Lösung, aber sie läuft in O (n ^ 2) Zeit
Algo 1:
Schritte: Es ist eine Brute-Force-Methode
- Haben Sie 2 for-Schleifen
für i = 1 bis i kleiner als array.length -1
für j = i + 1 bis j kleiner als array.length - Auf diese Weise können Sie Teilstrings jeder möglichen Kombination aus dem Array abrufen
- Haben Sie eine Palindrom-Funktion, die prüft, ob eine Zeichenfolge Palindrom ist
- Rufen Sie diese Funktion für jeden Teilstring (i, j) auf, wenn es sich um ein Palindrom handelt, und speichern Sie sie in einer Zeichenfolgenvariablen
- Wenn Sie den nächsten Palindrom-Teilstring finden und dieser größer als der aktuelle ist, ersetzen Sie ihn durch den aktuellen.
- Schließlich hat Ihre Zeichenfolgenvariable die Antwort
Probleme: 1. Dieses Algo läuft in O (n ^ 2) Zeit.
Algo 2:
- Kehren Sie die Zeichenfolge um und speichern Sie sie in einem anderen Array
- Suchen Sie nun den größten passenden Teilstring zwischen beiden Arrays
- Aber auch dies läuft in O (n ^ 2) Zeit
Könnt ihr euch einen Algo vorstellen, der in einer besseren Zeit läuft? Wenn möglich O (n) Zeit
algorithm
palindrome
Lerner
quelle
quelle
O(n^2)
darin, die Teilzeichenfolgen *O(n)
zu überprüfen, ob es sich um Palindrome handeltO(n^3)
.Antworten:
Sie können die die längste Palindrom mit finden Manacher-Algorithmus in der
O(n)
Zeit! Die Umsetzung finden Sie hier und hier .Für die Eingabe
String s = "HYTBCABADEFGHABCDEDCBAGHTFYW1234567887654321ZWETYGDE"
findet es die richtige Ausgabe1234567887654321
.quelle
while
eingebettetefor
mit einer Begrenzung, die der äußeren Schleife ähnlich zu sein scheint.Der Algo 2 funktioniert möglicherweise nicht für alle Zeichenfolgen. Hier ist ein Beispiel für eine solche Zeichenfolge "ABCDEFCBA".
Nicht dass der String "ABC" und "CBA" als Teilzeichenfolge hat. Wenn Sie die ursprüngliche Zeichenfolge umkehren, ist dies "ABCFEDCBA". und der am längsten passende Teilstring ist "ABC", was kein Palindrom ist.
Möglicherweise müssen Sie zusätzlich prüfen, ob es sich bei diesem am längsten passenden Teilstring tatsächlich um ein Palindrom handelt, das die Laufzeit von O (n ^ 3) hat.
quelle
Soweit ich das Problem verstanden habe, können wir Palindrome um einen Mittelindex finden und unsere Suche in beide Richtungen rechts und links vom Zentrum überspannen. Wenn wir wissen, dass sich an den Ecken der Eingabe kein Palindrom befindet, können wir die Grenzen auf 1 und Länge-1 setzen. Während wir auf die minimalen und maximalen Grenzen des Strings achten, überprüfen wir, ob die Zeichen an den Positionen der symmetrischen Indizes (rechts und links) für jede zentrale Position gleich sind, bis wir unsere maximale obere Grenze erreichen.
Die äußere Schleife ist O (n) (max n-2 Iterationen) und die innere while-Schleife ist O (n) (max um (n / 2) - 1 Iterationen)
Hier ist meine Java-Implementierung anhand des Beispiels anderer Benutzer.
Die Ausgabe davon ist die folgende:
quelle
expandAroundCenter
.Mit Regex und Ruby können Sie nach kurzen Palindromen wie diesen suchen:
quelle
Ich habe das folgende Java-Programm aus Neugier, einfacher und selbsterklärender HTH geschrieben. Vielen Dank.
quelle
Diese Frage wurde mir kürzlich gestellt. Hier ist die Lösung, die ich [irgendwann] gefunden habe. Ich habe es in JavaScript gemacht, weil es in dieser Sprache ziemlich einfach ist.
Das Grundkonzept besteht darin, dass Sie über die Zeichenfolge gehen und nach dem kleinstmöglichen Palindrom mit mehreren Zeichen suchen (entweder mit zwei oder drei Zeichen). Wenn Sie das haben, erweitern Sie die Ränder auf beiden Seiten, bis es kein Palindrom mehr ist. Wenn diese Länge länger als die aktuell längste ist, speichern Sie sie und gehen Sie weiter.
Dies könnte definitiv etwas mehr bereinigt und optimiert werden, aber es sollte in allen außer dem Worst-Case-Szenario (eine Zeichenfolge aus demselben Buchstaben) eine ziemlich gute Leistung haben.
quelle
i
j
l
s
if
und Zustand Wartung. Multi Return Points, Edge Cases ...Hallo, hier ist mein Code, um das längste Palindrom in der Zeichenfolge zu finden. Bitte beziehen Sie sich auf den folgenden Link, um den Algorithmus zu verstehen: http://stevekrenzel.com/articles/longest-palnidrome
Die verwendeten Testdaten sind HYTBCABADEFGHABCDEDCBAGHTFYW12345678987654321ZWETYGDE
quelle
Siehe Wikipedia-Artikel zu diesem Thema. Beispiel für die Java-Implementierung des Manacher-Algorithmus für eine lineare O (n) -Lösung aus dem folgenden Artikel:
quelle
Eine effiziente
Regexp
Lösung, die rohe Gewalt vermeidetBeginnt mit der gesamten Stringlänge und arbeitet abwärts bis zu 2 Zeichen, existiert sobald eine Übereinstimmung hergestellt ist
Für
"abaccddccefe"
die Regexp-Tests 7 Übereinstimmungen vor der Rückkehrccddcc
.vbs
vba
Funktion
quelle
quelle
Versuchen Sie die Zeichenfolge - "HYTBCABADEFGHABCDEDCBAGHTFYW123456789987654321ZWETYGDE"; Es sollte für gerade und ungerade Freunde funktionieren. Vielen Dank an Mohit!
Verwenden des Namespace std;
quelle
isPal
eine O (n) -Operation erstellen, nur um ihre Länge zu messen? Es hat auch einen fehlerhaften Versuch, sogar Palindrome zu handhaben. Bei gleichmäßigen Palindrom-Fehlern:else if(input_str[i] == input_str[j])
Kann niemals erfolgreich sein, da derselbe Test in der vorherigenif
Anweisung fehlgeschlagen sein muss . und es ist sowieso fehlerhaft, weil man nicht einfach anhand von 2 Zeichen im Abstand von 2 Positionen erkennen kann, ob man ein gerades oder ein ungerades Palindrom betrachtet (sieheAAA
undAAAA
).Der folgende Code berechnet Palidrom für Zeichenfolgen mit gerader und ungerader Länge.
Nicht die beste Lösung, funktioniert aber in beiden Fällen
HYTBCABADEFGHABCDEDCBAGHTFYW12345678987654321ZWETYGDE HYTBCABADEFGHABCDEDCBAGHTFYW1234567887654321ZWETYGDE
quelle
Damit können wir alle Palindrome aller Länge finden.
Stichprobe :
word = abcdcbc
modifiziertString = a # b # c # d # c # b # c
palinCount = 1010105010301
Länge des längsten Palindroms = 5;
längstes Palindrom = bcdcb
öffentliche Klasse MyLongestPalindrome {
}}
quelle
Dies gibt die längste Palindrom-Zeichenfolge von der angegebenen Zeichenfolge zurück
== AUSGABE ===
Eingabe: abcccde Ausgabe: ccc
Eingabe: abcccbd Ausgabe: bcccb
Eingabe: abedccde Ausgabe: edccde
Eingabe: abcccdeed Ausgabe: Tat
Eingabe: abcccbadeed Ausgabe: abcccba
quelle
Hier ist eine Implementierung in Javascript:
quelle
Für eine lineare Lösung können Sie den Manacher-Algorithmus verwenden. Es gibt einen anderen Algorithmus namens Gusfields Algorithmus, und unten ist der Code in Java:
Weitere Informationen zu anderen Lösungen wie der besten O (n ^ 2) -Lösung oder dem Manacher-Algorithmus finden Sie in meinem eigenen Blog .
quelle
Hier habe ich eine Logik geschrieben, versuche es :)
quelle
Diese Lösung ist von O (n ^ 2) -Komplexität. O (1) ist die Raumkomplexität.
quelle
{'DED': 3, '123456789987654321': 18, '67899876': 8, 'ABCDEDCBA': 9, '456789987654': 12, '34567899876543': 14, 'BCDEDCB': 7, 'ABA': 3, ' 5678998765 ': 10,' 2345678998765432 ': 16,' CDEDC ': 5,' 789987 ': 6,' 8998 ': 4} (' 123456789987654321 ', 18)
quelle
Hier ist mein Algorithmus:
1) Stellen Sie die aktuelle Mitte als ersten Buchstaben ein
2) Erweitern Sie gleichzeitig nach links und rechts, bis Sie das maximale Palindrom um das aktuelle Zentrum finden
3) Wenn das gefundene Palindrom größer als das vorherige Palindrom ist, aktualisieren Sie es
4) Stellen Sie die aktuelle Mitte als nächsten Buchstaben ein
5) Wiederholen Sie die Schritte 2) bis 4) für alle Buchstaben in der Zeichenfolge
Dies läuft in O (n).
Ich hoffe es hilft.
quelle
Referenz: Wikipedia.com
Der beste Algorithmus, den ich je gefunden habe, mit der Komplexität O (N)
quelle
Meine Lösung ist:
quelle
Substring()
==