Einführung
Bei dieser Herausforderung besteht Ihre Aufgabe darin, verallgemeinerte Teilfolgen von Zeichenfolgen zu finden. Die Teilsequenzen sind nicht unbedingt zusammenhängend, und sie können die Zeichenfolge auch "umwickeln", über ihr Ende hinausgehen und von vorne beginnen. Sie sollten jedoch die Anzahl der Wraps minimieren.
Formal lassen u
und v
alle zwei Saiten, und sein k ≥ 0
eine ganze Zahl. Wir sagen, dass dies u
eine k
umhüllende Folge von ist v
, wenn es unterschiedliche Indizes gibt, so dass und höchstens die Indizes erfüllen . Dies bedeutet, dass man das Innere finden kann, indem man von links nach rechts geht, einige seiner Charaktere auf dem Weg auswählt und sich meistens umhüllt (äquivalent, höchstens überstrichen ). Beachten Sie, dass selbst nach einem Wrap-Around kein Zeichen mehr als einmal ausgewählt werden kann und dass -wrapping-Teilsequenzen genau die gewöhnlichen Teilsequenzen sind, mit denen wir alle vertraut sind.i1, i2, ..., ilen(u)
u == v[i1] v[i2] ... v[ilen(u)]
k
ij
ij > ij+1
u
v
k
k+1
v
0
Die Aufgabe
Ihre Eingaben sind zwei nicht leere alphanumerische Zeichenfolgen u
und v
, und Ihre Ausgabe ist die kleinste Ganzzahl, k
so dass u
es sich um eine k
umschließende Teilsequenz von handelt v
. Wenn dies nicht k
der Fall ist, erfolgt die Ausgabe -1
.
Beispiel
Betrachten Sie die Eingaben u := xyzyxzzxyx
und v := yxzzazzyxxxyz
. Wenn wir anfangen, gierig nach den Charakteren von u
in zu suchen v
, werden wir uns dreimal umwickeln:
yxzzazzyxxxyz
>─x─────y────z┐
┌─────────────┘
└y───────x────┐
┌─────────────┘
└──zz─────x─y─┐
┌─────────────┘
└──────────x──>
Somit ist die korrekte Ausgabe höchstens 3. Beachten Sie, wie das Zeichen ganz links x
einmal ausgewählt und dann beim zweiten Durchlauf ignoriert wird, da es nicht wiederverwendet werden kann. Es gibt jedoch eine kürzere Methode mit nur 2 Wrap-arounds:
yxzzazzyxxxyz
>──────────xyz┐
┌─────────────┘
└yxzz────x────┐
┌─────────────┘
└───────y─x───>
Es stellt sich heraus, dass ein Wrap-Around (dh zwei Sweeps) nicht ausreicht, sodass die richtige Ausgabe erfolgt 2
.
Regeln und Boni
Sie können entweder eine Funktion oder ein vollständiges Programm schreiben und bei Bedarf auch die Reihenfolge der Eingaben ändern. Die niedrigste Byteanzahl gewinnt und Standardschlupflöcher sind nicht zulässig.
Es gibt einen Bonus von -10% für die Berechnung aller Testfälle in insgesamt weniger als 10 Sekunden. Ich werde unklare Fälle auf meiner Maschine testen. Meine Referenzimplementierung in Python dauert ungefähr 0,6 Sekunden. Ich habe einen 7 Jahre alten Laptop mit 1,86 GHz Dual-Core-CPU, den Sie vielleicht berücksichtigen möchten.
Testfälle
"me" "moe" -> 0
"meet" "metro" -> -1
"ababa" "abaab" -> 1
"abaab" "baabaa" -> 1
"1c1C1C2B" "1111CCCcB2" -> 3
"reverse" "reserved" -> 2
"abcdefg" "gfedcba" -> 6
"xyzyxzzxyx" "yxzzazzyxxxyz" -> 2
"aasdffdaasdf" "asdfddasdfsdaafsds" -> 2
x
in drei verschiedenen Sweeps verwendet wird. Es kann nur einmal verwendet werden.