Lassen Sie mich annehmen, dass die Länge der Zeichenfolge n
mindestens doppelt so groß ist wie die Periode p
.
Algorithmus
- Lassen
m
= 1 und S
die gesamte Zeichenkette
- Nehmen
m
= m * 2
- das nächste Vorkommen der Teil S finden [: m]
- Let
k
der Beginn des nächsten Auftreten sein
- überprüfen Sie, ob S [: k] ist die Zeit
- wenn nicht gehen zu 2.
Beispiel
Angenommen, wir haben einen String
CDCDFBFCDCDFDFCDCDFBFCDCDFDFCDC
Für jede Leistung m
von 2 finden wir Wiederholungen der ersten 2^m
Zeichen. Dann erweitern wir diese Sequenz auf ihr zweites Auftreten. Beginnen wir mit 2^1 so CD
.
CDCDFBFCDCDFDFCDCDFBFCDCDFDFCDC
CDCD CDCD CDCD CDCD CD
Wir erstrecken sich nicht CD
da das nächste Auftreten gerade danach ist. Allerdings ist CD
nicht der Teil wir das so läßt die nächste Leistung suchen: 2^2 = 4
und Teilzeichenfolge CDCD
.
CDCDFBFCDCDFDFCDCDFBFCDCDFDFCDC
CDCD CDCD
Jetzt erweitern wir unsere Zeichenfolge auf die erste Wiederholung.Wir bekommen
CDCDFBF
wir überprüfen, ob dies periodisch ist. Es ist nicht so, wir gehen weiter. Wir versuchen, 2^3 = 8, so CDCDFBFC
CDCDFBFCDCDFDFCDCDFBFCDCDFDFCDC
CDCDFBFC CDCDFBFC
wir versuchen, zu erweitern und wir bekommen
CDCDFBFCDCDFDF
und dies in der Tat ist unsere Zeit.
Ich erwarte, dass dies in O (n log n) mit einem KMP-ähnlichen Algorithmus funktioniert, um zu überprüfen, wo eine gegebene Zeichenkette erscheint. Beachten Sie, dass einige Randfälle hier noch ausgearbeitet werden sollten.
Intuitiv sollte dies funktionieren, aber meine Intuition scheiterte schon einmal an diesem Problem, also bitte korrigiert mich, wenn ich falsch liege. Ich werde versuchen, einen Beweis zu finden.
Ein sehr nettes Problem obwohl.
Warum ist der S2-Teilstring nicht AB? – csmckelvey
Sorry sein AB. Tippfehler. – Aditya
Jetzt bin ich verwirrt über S3. ABC wiederholt sich nicht, oder ist das auch ein Tippfehler? Entschuldige, dass ich wählerisch bin, ich versuche nur genau herauszufinden, was du für die Ausgabe willst. – csmckelvey