Introdução
Nesse desafio, sua tarefa é encontrar subsequências generalizadas de cadeias. As subsequências não são necessariamente contíguas e também podem "envolver" a cadeia, passando pelo final e iniciando novamente desde o início. Você vai querer minimizar o número de envoltórios.
Mais formalmente, deixe u
e v
seja duas cordas e k ≥ 0
um número inteiro. Dizemos que u
é uma k
subsequência de empacotamento de v
, se houver índices distintos tais que , e na maioria dos índices, satisfaçam . Isso significa que pode ser encontrado no interior , indo da esquerda para a direita, escolhendo alguns de seus personagens no caminho e dando voltas na maioria das vezes (equivalentemente, fazendo na maioria das varreduras ). Observe que nenhum caractere pode ser escolhido mais de uma vez, mesmo após uma volta, e que as subsequências de empacotamento são exatamente as subsequências comuns com as quais 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
A tarefa
Suas entradas são duas seqüências alfanuméricas não vazias u
e v
, e sua saída é o menor número inteiro, de k
modo que u
é uma k
subsequência de empacotamento v
. Se não k
existir, a saída será -1
.
Exemplo
Considere as entradas u := xyzyxzzxyx
e v := yxzzazzyxxxyz
. Se começarmos a procurar os personagens de u
in v
de uma maneira gananciosa, faremos 3 vezes:
yxzzazzyxxxyz
>─x─────y────z┐
┌─────────────┘
└y───────x────┐
┌─────────────┘
└──zz─────x─y─┐
┌─────────────┘
└──────────x──>
Portanto, a saída correta é no máximo 3. Observe como o caractere mais à esquerda x
é selecionado uma vez e depois ignorado na segunda varredura, pois não pode ser reutilizado. No entanto, existe um método mais curto com apenas 2 wrap-arounds:
yxzzazzyxxxyz
>──────────xyz┐
┌─────────────┘
└yxzz────x────┐
┌─────────────┘
└───────y─x───>
Acontece que uma volta (ou seja, duas varreduras) não é suficiente, portanto a saída correta é 2
.
Regras e Bônus
Você pode escrever uma função ou um programa completo e também pode alterar a ordem das entradas, se necessário. A contagem de bytes mais baixa vence e as brechas padrão não são permitidas.
Há um bônus de -10% para calcular todos os casos de teste em menos de 10 segundos no total. Testarei casos pouco claros na minha máquina; minha implementação de referência em Python leva cerca de 0,6 segundos. Eu tenho um laptop de 7 anos com CPU dual core de 1,86 GHz, que você pode levar em consideração.
Casos de teste
"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
é usado em três varreduras distintas. Só pode ser usado uma vez.