私はしばらくの間この問題について考えていましたが、再帰的な解決策しか見つけることができませんが、それを行うための動的なプログラミング方法があると感じていますが、それを理解することはできません。これは私が知らない有名な問題ですか?
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を返します(一致が見つかりました!)
他にどんな解決策がありますか?
inserting
かなり誤解を招くと思います。この一致する要素はpattern
、string
可能な限り正しい順序で要素に含まれていませんか?