Zuerst müssen wir ein Wort und eine gewünschte Größe lesen.
Dann müssen wir das längste Palindrom finden, das von Zeichen in diesem Wort in der angegebenen Reihenfolge erstellt wurde.
Zum Beispiel für Größe = 7 und Wort = "abcababac" lautet die Antwort 7 ("abababa").
Nachtrag: Die Größe des Wortes ist kleiner als 3000.
algorithms
strings
subsequences
Gilles 'SO - hör auf böse zu sein'
quelle
quelle
Antworten:
Es gibt einen Algorithmus, der nach Manachers Algorithmus benannt ist, der sehr schnell ist, einen linearen Zeitalgorithmus.
Siehe Wikipedia-Referenz
Nachtrag: Wenn Sie mit dem Z-Algorithmus wirklich vertraut sind , werden Sie feststellen, dass sie gleich sind.
Bearbeiten
quelle
Der schnellste Algorithmus, den ich mir vorstellen kann, ist die kreative Anwendung von LCS. Es kann dieses Problem in der Zeit O (N ^ 2) und im Raum O (N ^ 2) lösen, wobei N die Größe der Zeichenfolge ist.
LCS (S, reverse (S)) gibt Ihnen die größte palindromische Teilsequenz, da die größte palindromische Teilsequenz die größte gemeinsame Teilsequenz zwischen der Zeichenfolge S und ihrer Umkehrung ist.
Zum Beispiel ist
S = "abcababac"
T = "cababacba" (Rückseite von S)
LCS (S, T) = "abababa"
quelle
Das Problem, LPS eines Strings zu finden, kann in das Finden der längsten gemeinsamen Folge zweier Strings umgewandelt werden. In diesem Fall ist eine Zeichenfolge die ursprüngliche und die zweite die Umkehrung der ursprünglichen Zeichenfolge.
Das Problem mit der längsten allgemeinen Folge ähnelt dem Problem mit dem Mustervergleich, außer dass Sie Zeichen im Text überspringen dürfen. Das Ziel ist es auch, nur ein Spiel zurückzugeben, das so lang wie möglich ist.
LCS kann in mit Rekursion und Memoisierung gelöst werden.O(n2)
Es gibt einen etwas schnelleren Algorithmus, der von Masek und Paterson für die Zeitkomplexität . Papierlink : Masek und PatersonO(n2/lgn)
Zwei weitere von Hirschberg vorgestellte Algorithmen zur Berechnung der LCS von zwei Strings (Größe ) und (Größe ). Basierend auf der Annahme, dass die Symbole, die in diesen Zeichenfolgen erscheinen können, aus einem Alphabet der Größe (das ist in den meisten Fällen tatsächlich der Fall). So können Symbole mit -Bits im Speicher gespeichert werden, die in ein Speicherwort passen. Zwei Symbole können in -Zeit verglichen werden. Die Anzahl der Unterschiede in Zeichenfolge wird mit , was natürlich weniger als und .A n B m t log(t) O(1) B s m t
Dieser benötigt Zeit, wobei die Länge von LCS ist. Dies wird verwendet, wenn erwartet wird, dass die Länge des LCS gering ist. Wenn wir dieses Problem mithilfe der dynamischen Programmierung lösen, stellen wir fest, dass die meisten Einträge in der Matrix identisch sind, sodass wir die Idee der sparsamen dynamischen Programmierung verwenden können.O(pn+nlgn) p
Dieser Algorithmus benötigt Zeit. Dies ist sehr effizient, wenn die Länge des LCS nahe bei , in diesem Fall nahe bei .O(p(m+1−p)logn) m O(nlgn)
Detaillierte Verfahren und Algorithmen werden in der Arbeit von Hirschberg erläutert .
Ein weiterer guter Algorithmus wird von Sohel Rahman vorgeschlagen, der in der Zeit wird, wobei die Gesamtzahl der geordneten Positionspaare ist, an denen die Zeichenfolgen übereinstimmen. Es ist nicht anwendbar, wenn die Ordnung von , aber es gibt viele Fälle, in denen die Ordnung von . Dieser verwendet das Konzept RMQ (Range Maximum Query). Papierlink: RahmanO(Rloglogn) R R O(n2) R n
quelle
Ich vermisse wahrscheinlich etwas, weil es mir ziemlich trivial erscheint: Versuchen Sie, jedes Zeichen mit einem gleichen Zeichen zu koppeln. Setzen Sie dann das erste Zeichen jedes Paares auf die linke Seite, das andere Zeichen auf die rechte Seite, und wenn noch Zeichen übrig sind (dh Zeichen, die nicht mit einem anderen gepaart sind), wählen Sie eines davon aus und setzen Sie dieses in das Feld Mitte.
quelle