Längste sogar langen palindromische Ansprüche (mit unterschiedlichen benachbarten Zeichen mit Ausnahme der Mitte 2 Buchstaben)

cs.stackexchange https://cs.stackexchange.com/questions/125302

Frage

Sie erhalten eine Zeichenfolge s, die Kleinbuchstaben enthält. Sie müssen die Länge der größten Ansprüche von S finden, die das folgende Muster erfüllt: X1, x2, x3 ... xn, xn, ... x3, x2, x1 Wenn XI ein Zeichen von S ist n.

Input: Die Zeichenfolge: s
Ausgang: Die Ganzzahl: 2n
Einschränkung: 1 <= | s | <= 10 ^ 3

Beispieleingang 1: "ACDBDEA"
Beispielausgabe 1: 4
Erläuterung: "Adda" ist die längste Ansprüche nach dem angegebenen Muster.

Beispieleingang 2: "abbacdeedc"
Beispielausgabe 2: 6
Erläuterung: "cdededc" ist die längste Annahme nach dem angegebenen Muster.

Beispieleingang 3: "Taker"
Beispielausgabe 3: 0
Erläuterung: Keine Ansprüche folgt dem angegebenen Muster.


Diese Frage wurde in einem kodierenden Interview gestellt, und ich wusste nicht, wie er es löst. Ich habe verstanden, wie man die längste palindromische Ansprüche ermittelt, aber weiß nicht, wie man den eindeutigen benachbarten Zeichenteil implementiert. Bitte helfen Sie. Pseudocode ist in Ordnung.

War es hilfreich?

Lösung

goldene Regel

Hier ist die goldene Regel der dynamischen Programmierung.

Wenn Lösungen für kleinere Unterprobleme aufgrund von fehlenden Informationen nicht in Lösungen für größere Subprobleme kombiniert werden können, erweitern Sie die Unterprobleme mit Hinzufügen von Parametern , die diese fehlenden Informationen ergeben. .


erster Versuch

$ s $ ist eine Folge von $ N $ Buchstaben oder, $ s [0: n]. $

lass $ l [i] [j] $ Sei die Länge der längsten palindromischen Ansprüche von $ s [i : j] $ . Es ist leicht, die Basisfälle herauszufinden, und durch Erhöhen des $ I $ und / oder abnehmend $ J $ die Rezidivierungsbeziehungen für $ l [i] [j] $ .

Fügen Sie nun den Zustand der gerade Länge hinzu. Lassen Sie $ E [I] [J] $ die Länge der längsten gleichmäßigen palindromischen Darstellung von $ s [i : j] $ . Wir können die Basisfälle und die Rezidivierungsbeziehungen für $ E [I] [J] $ , ähnlichden, die denen von ähnlich sind, herausfinden $ L [i] [j] $ .

Fügen Sie nun den Zustand verschiedener benachbarter Buchstaben hinzu, d. H. Es kann kein Brief zweimal in Folge auftreten, außer dem Buchstaben in der Mitte. Lassen Sie $ D [i] [j] $ Seien Sie die Länge der längsten unglaublichen digitalen, angrenzenden PALINGROMIC-Anschließung von $ S [i: j] $ . Wie Sie vielleicht darauf hingewiesen haben, können wir die Rezidivierungsbeziehungen für $ D [I] [J] $ nicht herausfinden können, da sich ein solches Nachdenken an eine längere Erweiterung längere einführen könnte Buchstaben.

Die goldene Regel kommt zu Rettung. Fügen Sie einen weiteren Parameter hinzu, der den Buchstaben am Ende der längsten nachfolgenden Nacheinander klassifiziert, so dass wir feststellen können, wie Sie diese Anordnung ordnungsgemäß erweitern können.

lass $ d [i] [j] [\ lambda] $ Sei die Länge der längsten geradlinigen, angrenzenden paländischen, angrenzenden paländlichen, angrenzenden PALINGROMIC von $ s [i: j] $ das endet in Buchstaben $ \ lambda $ . Das heißt, wir berechnen $ d [i] [j] [\ text {'} a \ text {\'}] $ , $ D [I] [J] [\ Text {'} b \ text {'}] $ , $ D [I] [J] [\ Text {'} c \ text {'}] $ , $ \ CDs $ , $ d [i ] [j] [\ text {'} z \ text {'}] $ .

  • Die endgültige Antwort ist der größere von $ \ MAX_ \ LAMBDA D [0] [N-1] [\ lambda] $ und $ 0 $ .

  • Angenommen, der erste $ \ Text {'} A \ Text {'} $ in $ s $ at oder nach $ s [i] $ erscheint in $ s [\ vec {i _ {\ text { '} a \ text {'}}}] $ . Angenommen, der erste $ \ Text {'} a \ text {'} $ in $ s $ wird angezeigt $ s [\ overleftarrow {j _ {\ Text {'} A \ Text {'}}}] $ vor $ s [j] $ rückwärts gesucht. $ \ vec {i _ {Text {\ Text {'} \ Text {'}}} $ oder $ \ overleftarrow {j_ {\ text {'} \ text {'}}} $ ist auf $ - 1 $ eingestellt, wenn $ \ text {'} a \ text {'} $ ist nicht gefunden. Wir haben, für $ j \ ge i + 2 $ ,

    $$ D [I] [J] [\ Text {'} a \ text {'}]=begin {cases} \ max (2, 2 + \ max _ {\ \ mu \ NOT=Text {'} a \ text {'}} d [\ vec {i _ {\ text {'} a \ text {'}} \ text {'}}} + 1] [\ overleftarrow {j _ {\ text {'} \ text {'}}}] [\ mu]) & \ Text {if} 0 \ le \ vec {i _ {\ text {'} a \ text {'}} }} \ lt \ overleftarrow {j _ {\ text {'} a \ text {'}} \\ \\ -1 & \ Text {sonst,} \\ \ ENDE {Hüllen} $$ Wo $ \ mu $ über alle Kleinbuchstaben ausgeführt wird.

  • Der Basisfall ist $$ D [i] [i] [\ text {'} a \ text {'}]= 0. $$

Verallgemeinerung $ \ Text {'} A \ Text {'} $ an Variable $ \ lambda $ , wir können den Wiederholungsbeziehung und den Basisfall für $ d [i] [j] [\ lambda] $ schreiben.

Beachten Sie, dass mit den zusätzlichen Informationen, die in dem Parameter $ \ Lambda $ ausgeführt wurden, einfach, um die Rezidivrelation abzuleiten.

Während dieser Versuch erfolgreich ist, können wir es besser machen.


zweiter Versuch

Wir können die Unterprobleme vereinfachen.

lass $ f [i] [j] $ Sei die Länge der längsten derjenigen, die bei $ s beginnt [i] $ und endet bei

Pan Class="Math-Container"> $ S [J] $ . Dann haben wir

$$ F [I] [J]=begin {cases} \ max (2, 2 + \ max _ {\ \ mu \ nicht= s [i]} f [\ vec {i_ \ \ mu}] [\ overleftarrow {j_ \ mu}]) & \ Text {if} s [i]= S [j], \\ -1 & \ Text {sonst,} \\ \ ENDE {Hüllen} $$ wo $ - 1 $ steht für "nicht gefunden". Für alle Kleinbuchstaben $ \ mu $ , $ s [\ vec {i_ \ mu}] $ Ist der erste $ \ mu $ , der nach $ s [i] $ und $ s [\ overleftarrow {j_ \ mu}] $ ist der erste $ \ mu $ , der vor $ s [j] $ rückwärts gesucht. Wenn einer von ihnen nicht gefunden werden kann, wird der Begriff $ f [\ vec {i_ \ \}] [\ overleftarrow {j_ \ mu}] $ ignoriert.

Die endgültige Antwort ist der größere von $ \ max_ {i, j} f [i] [j] $ und 0.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit cs.stackexchange
scroll top