パターンを文字列に挿入するすべての可能な方法を見つける


7

私はしばらくの間この問題について考えていましたが、再帰的な解決策しか見つけることができませんが、それを行うための動的なプログラミング方法があると感じていますが、それを理解することはできません。これは私が知らない有名な問題ですか?


Q:文字列とパターンを指定して、パターンの文字を(順番に)文字列と照合する一意の方法の数を返します。

明確化:一致を見つけるには、パターンの最初の文字を取り、文字列内で最初に一致する文字を見つけ、次にパターンの2番目の文字を取り、以前に一致した後の文字列の最初の一致文字と一致します。キャラクター。

例1(4件一致):

文字列:DABBCDDE

パターン:ABD

可能な方法(太字はパターンが文字列と一致する場所です):

  • D AB BC D DE
  • D A B B C D DE
  • D AB BCD D E
  • D A B B CD D E

例2(0件一致):

文字列:ABC

パターン:BCA

(B、Cに一致し、文字列の最後にいる場合、前の文字に戻って一致することはできません)


再帰的なアプローチでは、パターン(pIndex)だけでなく、文字列(sIndex)の現在のインデックスを追跡するメソッドがあります。string [sIndex]がpattern [pIndex]と一致する場合は、メソッドを再度呼び出して、sIndexとpIndexを増やします。そうでない場合-sIndexを増やして、もう一度一致を見つけるようにしてください。再帰呼び出しの戻り値が加算されるため、メソッドは合計数を返します。(一致は1を追加、一致は0を追加)

基本ケース:

  • pIndexがパターンの長さより大きい場合、0を返します。

  • sIndexが文字列の長さより大きい場合、1を返します(一致が見つかりました!)


他にどんな解決策がありますか?


パターンで重複する値を使用できますか?パターンと文字列の両方が正しいことは保証されていますか?
Brandon Arnold

はい、パターンでは重複する値を使用できます。私が自分を明確にしすぎたかどうかはわかりませんが、注文をスクランブルすると、問題が変わります。したがって、文字列としてCBAがあり、パターンがABCである場合、最初の一致はAであるため、一致はありません。次に、パターン(BC)の残りの文字と一致する文字が文字列にありません。それははっきりしていますか?
Daniel Olsson

私はinsertingかなり誤解を招くと思います。この一致する要素はpatternstring可能な限り正しい順序で要素に含まれていませんか?
チェンマイ

私の正規表現の回答を削除しました。これは、jsフィドルで遊んだ後、可能なすべての順列に一致しないことがわかったためです:(
Gavin Clarke

1
マイ、そうだよ、言い回しを変えるよ。
Daniel Olsson 2016年

回答:


1

これを解決するために動的プログラミングを使用する必要はないと思います。これが解決策だと思います:

  1. 最初に、リストのリストを作成して、指定されたテキストのパターン内の文字の出現を維持します。

  2. こうなります

次の図:

   A    B    D 
             0 
   1 -> 2 -> 5
        3    6 
  1. これは、(0インデックスを使用すると仮定して)Aが0番目の位置で発生し、Bが2,3の位置で発生し、Dが0,5,6の位置で発生することを意味します。

  2. 連続する列(ここではA、BおよびB、D)のペアごとに、ポインターを使用して、列の対応する値を次の列の次に大きい値にマップします。ここで、1(col1内)は2(col2内)へのポインターを持ち、2(col2内)は5(col3内)へのポインターを持ちます。0は2より小さいためです。3(col2内)は5(col3内)へのポインターです)(ここでは描けませんでした)。

  3. 最初の列の各値について、ポインターを使用して可能な方法の数を見つけます。ここで1-> 2および2-> 5であり、したがって可能なウェイの数は2 * 2ウェイです(つまり、1-> 2-> 5、1-> 2-> 6、1-> 3-> 5、1)。 -> 3-> 6)。Aの各値について、列の残りの要素の数を掛けるだけです。

  4. ここでは、Column1(つまりA)の値は1つだけ存在します。複数の列がある場合、ポインターを使用してAの各値の値を計算し、それらすべてを合計してウェイの数を取得します。

  5. リストの構築はO(n)で、ポインタのスペースと構築時間はO(n)なので、複雑さはO(n)だと思います。


これは正しいですが、パターン文字のオカレンスの生成についてより具体的にする必要があります。その複雑さはO(nm)で、nはパターンの長さ、mはテキストの長さです。(パターン内の各文字の出現をすべて見つける必要があります)。
Adrian Buzea 2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.