Lassen sei ein Alphabet und lass Zeichenfolgen über diesem Alphabet sein. Rufen Sie eine Zeichenfolge auf gut wenn ist eine Folge von aber keine Folge von .
Gegeben Ich suche die kürzeste gute Saite . Gibt es dafür einen vernünftigen Algorithmus? Ich interessiere mich für einen praktischen Algorithmus, auch wenn seine Laufzeit im ungünstigsten Fall nicht großartig ist. In meiner Domäne die Zeichenfolgen mag ziemlich lang sein, aber ich gehe davon aus, dass es eine gute Saite geben wird das ist ziemlich kurz, falls das hilft.
Der Fall wird von der kürzesten Teilsequenz einer Zeichenfolge behandelt, das ist keine Teilsequenz einer anderen Zeichenfolge , aber ich muss mich mit dem Fall befassen.
Antworten:
Fehler
Zunächst habe ich in den Kommentaren einige Fehler gemacht: Sowohl die ursprüngliche Behauptung, die ich über das Verschachteln gemacht habe, als auch der Kommentar "korrigieren" (jetzt gelöscht) waren falsch, und separat meine Behauptung, dass das Ausprobieren aller möglichen Verschachtelungen eine optimale Lösung ergeben muss war auch falsch (ich gebe ein einfaches Gegenbeispiel unten). Zum Schluss mein Vorschlag zu setzenx+=zj und iterieren oder die Strahlensuche verwenden ist eigentlich auch nicht hilfreich: Welche Antwort auch immer dadurch erzeugt werden könnte und die Anwendung von Aryabhatas DP kann niemals besser sein als die Verwendung des Originals x+ , da es lediglich die Größe des Lösungssatzes reduziert, aus dem der DP auswählen kann. Es tut uns leid! Hoffentlich enthält die verbesserte Version unten keine weiteren Probleme ...
Ich habe auch zwei Fehler in Aryabhatas DP bemerkt . Glücklicherweise können beide leicht repariert werden (siehe meine Kommentare zu diesem Beitrag).
Eine heuristische Lösung mit zufälligen Verschachtelungen
Wenn Sie nicht unbedingt die kürzeste Teilsequenz benötigen, können Sie die Tatsache verwenden, dass, wenn eine Zeichenfolges ist eine Folge von einigen x−i dann ist es auch eine Folge jeder möglichen Verschachtelung aller Stringsx−i . Drehen Sie dies um, wenns ist keine Folge einer bestimmten Verschachtelung aller Zeichenketten x−i , Dann ist es keine Folge von jedem einzelnenx−i .
Sie können also viele verschiedene Möglichkeiten ausprobieren, um das zufällig zu verschachtelnn Saiten x−i in eine einzelne Zeichenfolge und für jede solche Verschachtelung yj Suchen Sie nach der kürzesten Folge zj von x+ das vermeidet, eine Folge von zu sein yj Verwenden Sie den netten DP-Algorithmus von Aryabhata für den Fall mit zwei Zeichenfolgen und wählen Sie den gewünschten auszj ist über alle von Ihnen versuchten Verschachtelungen am kürzesten.
Vorsichtsmaßnahme: Keine Garantie für Optimalität, auch wenn wir alle Verschachtelungen versuchen
Überraschenderweise (zumindest für mich) ist es nicht garantiert, dass Sie die optimale Lösung finden, selbst wenn Sie das obige Verfahren für alle möglichen Verschachtelungen wiederholen: Betrachten Sie den Fall, in demx+=aaa , n=2 , und x−1=x−2=a . Dannaa ist eine optimale Lösung mit Länge 2, aber die kürzeste Lösung, die durch Ausprobieren aller Verschachtelungen von gefunden wird x−1 und x−2 ist aaa mit der Länge 3.
quelle