前書き
この課題では、一般的な文字列のサブシーケンスを見つけることがタスクです。サブシーケンスは必ずしも連続しているわけではなく、文字列を「ラップアラウンド」して、その終わりを超えて最初からやり直すこともできます。ただし、ラップの数を最小限に抑える必要があります。
より正式には、let u
とv
be任意の2つの文字列、および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
の-wrappingサブシーケンスv
。そのようなものk
が存在しない場合、出力はになります-1
。
例
入力u := xyzyxzzxyx
とを考慮してくださいv := yxzzazzyxxxyz
。u
in の文字をv
貪欲な方法で探し始めたら、約3回ラップします。
yxzzazzyxxxyz
>─x─────y────z┐
┌─────────────┘
└y───────x────┐
┌─────────────┘
└──zz─────x─y─┐
┌─────────────┘
└──────────x──>
したがって、正しい出力は最大で3です。一番左の文字x
が1回選択され、2回目のスイープでは再利用できないため、どのように無視されるかに注意してください。ただし、ラップアラウンドが2つしかない短い方法があります。
yxzzazzyxxxyz
>──────────xyz┐
┌─────────────┘
└yxzz────x────┐
┌─────────────┘
└───────y─x───>
1回のラップアラウンド(つまり、2回のスイープ)では不十分であることが判明したため、正しい出力は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
は3つの異なるスイープで使用されるため、無効です。一度だけ使用できます。