Introducción
En este desafío, su tarea es encontrar subsecuencias generalizadas de cadenas. Las subsecuencias no son necesariamente contiguas, y también pueden "envolver" la cadena, pasando su final y comenzando de nuevo desde el principio. Sin embargo, querrás minimizar la cantidad de envolturas.
Más formalmente, deja u
y v
ser dos cuerdas, y k ≥ 0
un número entero. Decimos que u
es una k
subsecuencia de ajuste de v
, si hay índices distintos de ese tipo , y como máximo satisfacen los índices . Esto significa que se puede encontrar en el interior yendo de izquierda a derecha, eligiendo algunos de sus personajes en el camino y envolviéndose en la mayoría de las veces (de manera equivalente, haciendo como máximo barridos ). Tenga en cuenta que no se puede elegir ningún personaje más de una vez, incluso después de un ajuste, y que las subsecuencias de ajuste son exactamente las subsecuencias ordinarias con las que todos estamos familiarizados.i1, i2, ..., ilen(u)
u == v[i1] v[i2] ... v[ilen(u)]
k
ij
ij > ij+1
u
v
k
k+1
v
0
La tarea
Sus entradas son dos cadenas alfanuméricas u
y no vacías v
, y su salida es el entero más pequeño k
, que u
es una k
subsecuencia de ajuste de v
. Si no k
existe tal , la salida será -1
.
Ejemplo
Considere las entradas u := xyzyxzzxyx
y v := yxzzazzyxxxyz
. Si partimos en busca de los personajes de u
en v
de una manera codiciosa, vamos a envolver alrededor de 3 veces:
yxzzazzyxxxyz
>─x─────y────z┐
┌─────────────┘
└y───────x────┐
┌─────────────┘
└──zz─────x─y─┐
┌─────────────┘
└──────────x──>
Por lo tanto, la salida correcta es como máximo 3. Observe cómo x
se selecciona el carácter más a la izquierda una vez, y luego se ignora en el segundo barrido, ya que no se puede reutilizar. Sin embargo, existe un método más corto con solo 2 envolturas:
yxzzazzyxxxyz
>──────────xyz┐
┌─────────────┘
└yxzz────x────┐
┌─────────────┘
└───────y─x───>
Resulta que una envoltura (es decir, dos barridos) no es suficiente, por lo que la salida correcta es 2
.
Reglas y bonos
Puede escribir una función o un programa completo, y también puede cambiar el orden de las entradas si es necesario. El conteo de bytes más bajo gana, y las lagunas estándar no se permiten.
Hay una bonificación de -10% para calcular todos los casos de prueba en menos de 10 segundos en total. Probaré casos poco claros en mi máquina; Mi implementación de referencia en Python toma alrededor de 0.6 segundos. Tengo una computadora portátil de 7 años con una CPU de doble núcleo de 1.86 GHz, que es posible que desee tener en cuenta.
Casos de prueba
"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
se usa en tres barridos distintos. Solo se puede usar una vez.