Вступление
В этой задаче ваша задача - найти обобщенные подпоследовательности строк. Подпоследовательности не обязательно являются смежными, и они также могут «обвивать» строку, проходя через ее конец и начиная снова с начала. Вы хотите минимизировать количество оберток, хотя.
Более формально, пусть uи vбудут любые две строки и k ≥ 0целое число. Мы говорим , что uэто k-упаковочная и дозирующая подпоследовательность из v, если существует различные показатели , такие , что и в большинстве индексов удовлетворяют . Это означает, что его можно найти внутри , перейдя слева направо, выбрав некоторые из его символов в пути и обернувшись вокруг в большинстве случаев (эквивалентно, выполняя самое большее размах ). Обратите внимание, что ни один символ не может быть выбран более одного раза, даже после переноса , и что подпоследовательности обтекания - это в точности обычные подпоследовательности, с которыми мы все знакомы.i1, i2, ..., ilen(u)u == v[i1] v[i2] ... v[ilen(u)]kijij > ij+1uvkk+1v0
Задание
Ваши входные данные представляют собой две непустые буквенно-цифровые строки uи v, а ваши выходные данные представляют собой наименьшее целое число k, которое uявляется kподпоследовательностью -wrapping v. Если такого не kсуществует, вывод должен быть -1.
пример
Рассмотрим входы u := xyzyxzzxyxи v := yxzzazzyxxxyz. Если мы начнем искать персонажей uв vжадной манере, мы обернемся 3 раза:
yxzzazzyxxxyz
>─x─────y────z┐
┌─────────────┘
└y───────x────┐
┌─────────────┘
└──zz─────x─y─┐
┌─────────────┘
└──────────x──>
Таким образом, правильный вывод - максимум 3. Обратите внимание, как крайний левый символ xвыбирается один раз, а затем игнорируется во втором цикле, поскольку его нельзя использовать повторно. Тем не менее, существует более короткий метод только с двумя переходами:
yxzzazzyxxxyz
>──────────xyz┐
┌─────────────┘
└yxzz────x────┐
┌─────────────┘
└───────y─x───>
Оказывается, одного обхода (то есть двух циклов) недостаточно, поэтому правильный вывод получен 2.
Правила и бонусы
Вы можете написать либо функцию, либо полную программу, а также при необходимости изменить порядок входных данных. Побеждает меньшее количество байтов, и стандартные лазейки запрещены.
Существует бонус -10% для вычисления всех тестовых случаев менее чем за 10 секунд. Я буду проверять неясные случаи на моей машине; моя эталонная реализация в Python занимает около 0,6 секунд. У меня есть 7-летний ноутбук с двухъядерным процессором 1,86 ГГц, который вы можете принять во внимание.
Тестовые случаи
"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используется в трех различных циклах. Он может быть использован только один раз.