介绍
在这个挑战中,您的任务是找到字符串的广义子序列。子序列不一定是连续的,它们也可以“环绕”字符串,越过字符串的末端并从头开始。不过,您将需要尽量减少换行次数。
更正式地说,让u
并且v
是任意两个字符串和k ≥ 0
一个整数。我们说u
是k
,计量子的v
,如果有不同的指标,从而,在大多数指标的满足。这意味着可以在内部找到,方法是从左到右,在途中选择其某些字符,然后最多包装(等效地,最多扫描一次)。请注意,即使重新包装后,也不能选择一个以上的字符,而且-wrapping子序列恰好是我们都熟悉的普通子序列。i1, i2, ..., ilen(u)
u == v[i1] v[i2] ... v[ilen(u)]
k
ij
ij > ij+1
u
v
k
k+1
v
0
任务
您的输入是两个非空的字母数字字符串u
和v
,而您的输出是最小的整数k
,因此u
是的k
换行子序列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秒。我有一台使用1.86 GHz双核CPU的7年笔记本电脑,您可能要考虑到这一点。
测试用例
"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
在三个不同的扫描中使用。它只能使用一次。