3 つの文字列 A、B、C が与えられた場合、C が A と B のインターリーブかどうかをチェックする関数を記述します。C が A と B のすべての文字と個々のすべての文字の順序を含む場合、C は A と B のインターリーブであると言われます。文字列は保持されます。
例えば:
- 'hotdog' は 'hot' と 'dog' のインターリーブです (簡単)
- 'superb' は 'up' と 'serb' のインターリーブです。
- 'heartache' は 'ear' と 'ache' のインターリーブです
- 'chat' は 'hat' と 'cat' のインターリーブです
- 'cheaters' は'chat' と 'seer' のインターリーブではありません。これは、それぞれの文字がすべて含まれている一方で、'seer' の文字が順番どおりに表示されないためです。
私はネットでいくつかの解決策を見つけましたが、以下は私のアプローチです。ありがとう。
私のアルゴリズム:
- とをトラバースし
a
ますc
。トラバーサル中、最初に 2 つのことを計算します: char が存在するかどうかと、インデックス、つまりf
char が見つかった場所を保存します。そして、char を見つけ次第、その場所に特別な char を配置して、この char をそれ以上考慮しないようにする必要があります。 - 前の文字を見つけたインデックスから、次の文字を
a
検索します。見つからない場合は戻ります。c
f
- あなたも同じです
b
。 - 上記の手順を実行した後、見つかった場合は最初に
false
繰り返して結果を返します。b
a
例えば
a = xxy, b = xxz and c = xxzxxxy
から始めます:
- for x in a, c = 0xzxxxy (特殊文字として 0 を入れています)
- a の x の場合、インデックス 0 以降から開始します (前の文字が 0 で見つかったため)c = 00zxxxy.
- a の y の場合、c = 00zxxx0
- b の x の場合、c = 00z0xx0
- b の x の場合、c = 00z00x0
- b の z の場合、b の前の文字を見つけたインデックスであるインデックス 4 の後に z を見つけることができませんでした。
で始まると
a
false が返されるので、ここでbから始めます。したがって、bから始めます:
- b の x の場合、c = 0xzxxxy
- b の x の場合、c = 00zxxxy
- b の z の場合、c = 000xxxy
- a の x の場合、c = 0000xxy
- a の x の場合、c = 00000xy
- a の y の場合、c = 00000x0
したがって、true iec は a と b のインターリーブされた文字列です。