introduction
Dans ce défi, votre tâche consiste à trouver des sous-séquences généralisées de chaînes. Les sous-séquences ne sont pas nécessairement contiguës, et elles peuvent également "boucler" la chaîne, en dépassant sa fin et en recommençant depuis le début. Vous voudrez cependant minimiser le nombre de tours.
Plus formellement, laissez uet vsoyez deux chaînes quelconques et k ≥ 0un entier. Nous disons que uc'est une ksous-séquence enveloppante de v, s'il existe des indices distincts tels que , et au plus des indices satisfont . Cela signifie que vous pouvez le trouver à l'intérieur en allant de gauche à droite, en choisissant certains de ses personnages en chemin et en vous déplaçant la plupart du temps (de manière équivalente, en faisant tout au plus des balayages ). Notez qu'aucun caractère ne peut être choisi plus d'une fois, même après un bouclage , et que les sous-séquences -wrapping sont exactement les sous-séquences ordinaires que nous connaissons tous.i1, i2, ..., ilen(u)u == v[i1] v[i2] ... v[ilen(u)]kijij > ij+1uvkk+1v0
La tâche
Vos entrées sont deux chaînes alphanumériques non vides uet v, et votre sortie est le plus petit entier ktel que ula ksous-séquence d'habillage v. S'il n'en kexiste pas, la sortie doit être -1.
Exemple
Considérez les entrées u := xyzyxzzxyxet v := yxzzazzyxxxyz. Si nous commençons à chercher les personnages de ude vmanière gourmande, nous allons envelopper 3 fois:
yxzzazzyxxxyz
>─x─────y────z┐
┌─────────────┘
└y───────x────┐
┌─────────────┘
└──zz─────x─y─┐
┌─────────────┘
└──────────x──>
Ainsi, la sortie correcte est au maximum de 3. Notez comment le caractère le plus à gauche xest sélectionné une fois, puis ignoré lors du deuxième balayage, car il ne peut pas être réutilisé. Cependant, il existe une méthode plus courte avec seulement 2 bouclages:
yxzzazzyxxxyz
>──────────xyz┐
┌─────────────┘
└yxzz────x────┐
┌─────────────┘
└───────y─x───>
Il s'avère qu'un bouclage (c'est-à-dire deux balayages) n'est pas suffisant, donc la sortie correcte est 2.
Règles et bonus
Vous pouvez écrire une fonction ou un programme complet, et vous pouvez également modifier l'ordre des entrées si nécessaire. Le nombre d'octets le plus bas gagne et les failles standard sont interdites.
Il y a un bonus de -10% pour le calcul de tous les cas de test en moins de 10 secondes au total. Je vais tester des cas peu clairs sur ma machine; mon implémentation de référence en Python prend environ 0,6 seconde. J'ai un ordinateur portable de 7 ans avec un processeur dual core 1,86 GHz, dont vous voudrez peut-être tenir compte.
Cas de test
"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
xest utilisé dans trois balayages distincts. Il ne peut être utilisé qu'une seule fois.