introduzione
In questa sfida, il tuo compito è trovare sottosequenze generalizzate di stringhe. Le sottosequenze non sono necessariamente contigue e possono anche "avvolgere" la stringa, oltrepassandone la fine e ricominciando dall'inizio. Tuttavia, ti consigliamo di ridurre al minimo il numero di avvolgimenti.
Più formalmente, lascia uche vsiano due stringhe e k ≥ 0un numero intero. Diciamo che uè una ksottosequenza avvolgente di v, se esistono indici distinti tali , e al massimo gli indici soddisfano . Ciò significa che può essere trovato all'interno andando da sinistra a destra, scegliendo alcuni dei suoi personaggi lungo la strada e avvolgendosi il più delle volte (equivalentemente, facendo al massimo spazzate ). Nota che nessun personaggio può essere scelto più di una volta, anche dopo un avvolgimento, e che le sottosequenze avvolgenti sono esattamente le sottosequenze ordinarie che tutti conosciamo.i1, i2, ..., ilen(u)u == v[i1] v[i2] ... v[ilen(u)]kijij > ij+1uvkk+1v0
L'obiettivo
I tuoi input sono due stringhe alfanumeriche non vuote ue v, e il tuo output è il numero intero più piccolo ktale da uessere una ksottosequenza avvolgente di v. Se non kesiste, l'output deve essere -1.
Esempio
Considera gli input u := xyzyxzzxyxe v := yxzzazzyxxxyz. Se iniziamo a cercare i personaggi di uin vin modo avido, ci avvolgeremo 3 volte:
yxzzazzyxxxyz
>─x─────y────z┐
┌─────────────┘
└y───────x────┐
┌─────────────┘
└──zz─────x─y─┐
┌─────────────┘
└──────────x──>
Pertanto, l'output corretto è al massimo 3. Nota come il carattere più a sinistra xviene selezionato una volta, quindi ignorato al secondo passaggio, poiché non può essere riutilizzato. Tuttavia, esiste un metodo più breve con solo 2 avvolgenti:
yxzzazzyxxxyz
>──────────xyz┐
┌─────────────┘
└yxzz────x────┐
┌─────────────┘
└───────y─x───>
Si scopre che un avvolgimento (ovvero due sweep) non è sufficiente, quindi l'output corretto è 2.
Regole e bonus
È possibile scrivere una funzione o un programma completo e, se necessario, è anche possibile modificare l'ordine degli ingressi. Vince il conteggio di byte più basso e non sono consentite scappatoie standard.
C'è un bonus del -10% per calcolare tutti i casi di test in meno di 10 secondi in totale. Testerò casi poco chiari sulla mia macchina; la mia implementazione di riferimento in Python dura circa 0,6 secondi. Ho un laptop di 7 anni con CPU dual core da 1,86 GHz, che potresti voler prendere in considerazione.
Casi 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
xviene utilizzato in tre distinti sweep. Può essere usato solo una volta.