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 u
che v
siano due stringhe e k ≥ 0
un numero intero. Diciamo che u
è una k
sottosequenza 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)]
k
ij
ij > ij+1
u
v
k
k+1
v
0
L'obiettivo
I tuoi input sono due stringhe alfanumeriche non vuote u
e v
, e il tuo output è il numero intero più piccolo k
tale da u
essere una k
sottosequenza avvolgente di v
. Se non k
esiste, l'output deve essere -1
.
Esempio
Considera gli input u := xyzyxzzxyx
e v := yxzzazzyxxxyz
. Se iniziamo a cercare i personaggi di u
in v
in 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 x
viene 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
x
viene utilizzato in tre distinti sweep. Può essere usato solo una volta.