Nehmen wir ein konkretes Beispiel und hoffe, dass ich klar sein kann. Angenommen, die (geordnete) Liste der Monate:Auflösen mehrdeutiger Kategorien in einer geordneten Liste
Januar < Februar < März < ... < Dezember
(mit ganzen Zahlen, die für die Monate stehen, Null-basiert), so dass
Jan 0, Februar 1, ... Dec ist 11.
Jetzt nehme ich haben keinen Zugang zu den vollständigen Namen der Monate und bin in der folgenden Liste gegeben, wo Monaten ihre ersten Buchstaben verkürzt wurden und e für eine leere Kategorie steht, wie folgt aus:
e, f, e, e, e
Wenn ich eine Liste von "unzweideutig Monaten" build (f: 1, n: 8, O: 9 n: 10, D: 11), I kann die leeren Kategorien füllen, indem zuerst die erste Kategorie berechnet wird (mit Subtraktion und Mod 12), und dann den Rest von dort schreiben. Allerdings nehme ich die Liste gegeben bin
E, A, e, e, J, e
Dann kann ich (intuitiv) berechnen, dass, obwohl A mehrdeutig ist (könnte April sein oder August), in diesem Zusammenhang kann es nur April sein, da August keine J s folgt nach 2 Kategorien hat. Sobald ich das finde, kann ich von Anfang an alles neu berechnen.
Meine Frage ist schließlich: gibt es eine analytische Lösung (Funktion, Algorithmus) für dieses Problem, oder ist meine einzige Hoffnung, rohe Gewalt zu verwenden, um jede mögliche Beziehung zu definieren? Bei einigen Beispielen kann keine Begriffsklärung Algorithmus/Funktion arbeiten: den Fall betrachtet, wo ich ein J gefolgt von 11 e ‚s, gefolgt von einem J von 11 e gefolgt‘ s ... Da es ist ein Jahr dazwischen, kann ich J nicht im Januar, Juni oder Juli disambiguieren.
Antwort: Ich habe die Antwort von Il-Bhima gecoded, weil für diesen Fall insbesondere die Regexs ok sind, sogar bei einer höheren Laufzeit O (mn). Allerdings akzeptierte ich Bens Antwort als die richtige Antwort, weil sie die anderen subsumiert (erwähnt die Regex-Lösung), schlägt aber auch einen besseren Weg vor, indem sie den KMP-Algorithmus O (m + n) verwendet, obwohl dies für größere Zahlen der Zeichenkette gilt um dem Muster zu entsprechen. Danke an alle.
Danke, Ben. Könnten Sie bitte erläutern, wie KMP die Werte für das Beispiel meines "J" finden würde? Vielen Dank! –