Schnellster Algorithmus zum Finden der längsten Palindrom-Teilsequenz


8

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.


Mit maximalem Palindrom meinen Sie, dass Sie Zeichen aus der Zeichenfolge löschen können, um ein Palindrom zu verlassen, und Sie möchten das längste Palindrom (oder minimale Entfernung)?

1
In Ihrem Beispiel gibt es auch Cababac der Länge 7. Die entfernten Zeichen befinden sich dann nebeneinander und am Ende. Ist Ihnen eine dieser Einschränkungen gestattet? Sie vereinfachen die Suche erheblich.

6
Dies wurde bereits bei Stack Overflow beantwortet: Wie findet man die längste palindromische Subsequenz?

@GenericHuman: Die beste Antwort in dieser Frage war gut für das Kapitel des Lehrbuchs, das der Fragesteller las. Es ist keine gute Antwort für diesen Fragesteller. Siehe diese Frage: stackoverflow.com/questions/7043778/… stattdessen.
Neil G

1
Wie wird die Größe verwendet? Sie sagen, Sie möchten das "maximale Palindrom". Was ist, wenn das längste Palindrom länger oder kürzer als die angegebene Größe ist?
Gilles 'SO - hör auf böse zu sein'

Antworten:


6

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

fj,k=max(fj,k+1,fj+1,k,2[Sj=Sk]+fj+1,k1),j<kfk,k=1fj,k=0,j>k
fj,kSj..k[P]

4
Sie antworten im Teilstring-Fall, aber die Frage bezieht sich auf Teilsequenzen.

Sollte der erste Term nicht f (j, k-1) sein?
Abhishek Bansal

5

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"


Können Sie argumentieren, dass dieser Algorithmus der schnellste ist, den sich jemand ausdenken kann, wie die Frage stellt?
Juho

@ Juho: Ich kann nicht. :( Dies ist der schnellste Algorithmus, den ich kenne. Er wurde jedoch vom UVA-Online-Richter ( uva.onlinejudge.org/external/114/11404.html ) akzeptiert, und in ACM sind die Problembeschränkungen so, dass nur die optimierte Lösung erfolgreich ist. Daher ist die Lösung schnell genug, nicht sicher über die schnellste.
Shashwat

2

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 .AnBmtlog(t)O(1)Bsmt

  1. 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

  2. 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+1p)logn)mO(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)RRO(n2)Rn


@FrankW, danke! Ich habe die Antwort bearbeitet. Jetzt sind Links sichtbar.
Surendra

Ihre Formatierung fehlte noch; Bitte überprüfen Sie meine Bearbeitung, um zu sehen, was möglich ist. Die Artikelreferenzen sind immer noch schlecht, da sie darauf beruhen, dass der Link für immer funktioniert. Sehen Sie hier für Beratung; Titel, Autoren und Jahr sollten (mindestens) angegeben werden.
Raphael

Zwei Bedenken mit , was Sie schreiben: 1) „erfordert “ bedeutungslos ist (da gibt obere Grenzen), und ignorieren , dass wahrscheinlich falsch; Ich würde vermuten, dass sie Obergrenzen dieser Ordnungen anzeigen, aber die Algorithmen können sogar schneller sein. 2) Zumindest im letzten Absatz möchten Sie . O()OΩ(n2)
Raphael

-1

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.


1
Wenn Sie (mit Wörtern) haben, wie würden Sie entscheiden, ob das erste und letzte Zeichen des Palindroms oder ? Sie müssen den Inhalt von bevor Sie eine Entscheidung treffen, ob Sie das längste Palindrom haben möchten. aubvawbu,v,wabu,v,w
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.