コードはので、ここで説明したのですが、文字列は、だから我々は我々の状態は、パターンの部分一致にしたいナノ
あるとしましょう
に何が起こっているかを確認する例です。 "nano"
に一致する可能性のある部分は、 "", "n", "na", "nan", or (the complete match) "nano"
です。つまり、文字列の接頭辞にすぎません。一般に、パターンがm文字の場合、m + 1状態が必要です。ここではm = 4であり、5つの状態が存在する。
"...nan"
を見て、別の文字の"x"
を見た場合、どのような状態に進む必要がありますか?明らかに、xが試合の次のキャラクタ(ここでは「o」)であれば、次に長いプレフィックス(ここでは「nano」)に移動する必要があります。そして、明らかに、我々は完全な試合を見た後、我々はその状態に留まります。しかし、"a"
のような別の文字があるとしますか?つまり、これまでの文字列は"...nana"
のようになります。最も長い部分一致は、ちょうど"na"
であり、最後の2文字を利用することができる。したがって、状態"nan"
から、"a"
というラベルの矢印を状態"na"
に描画する必要があります。 "na"
は"nano"
のプレフィックス(状態なので)と"nana"
という接尾辞です(これは部分的に一致しています)。
一般に、状態+文字から状態への遷移は、元のパターンのプレフィックスと、直前に見た状態+文字の接尾辞である最長の文字列です。これは、すべての遷移がどうあるべきかを私たちに伝えるのに十分です。私たちは、パターン"nano"
を探しているなら、遷移表は、今どのように我々は、実際に検索パターンを行うには、このテーブルを使用しない
n a o other
--- --- --- ---
empty: "n" empty empty empty
"n": "n" "na" empty empty
"na": "nan" empty empty empty
"nan": "n" "na" "nano" empty //just as an illustration, nan + n = n because we can only use the last 'n', nan + a = na because now we can use the last two 'na'
"nano": "nano" "nano" "nano" "nano"
でしょうか?
これを文字列"banananona"
でシミュレートすると、一度に1文字ずつ移動することによって、空の空の"n", "na", "nan", "na", "nan", "nano", "nano", "nano"
の状態のシーケンスが得られます。状態"nano"
で終わるので、この文字列には"nano"
が含まれています。上の表をどのように使うのかを拡張してみましょう。 'b'では、可能な州のいずれにもありません'n', 'na', 'nan', 'nano'
。したがって、空であるとみなされます... 'ba'
に到達したときと同じです。次の文字「'n'
」を押すと、基本的に空からnになりますので、上記の表を使用して、それが'n'
で終わるのを見ます。今はbanananonaの4文字になっていますので、'n'
から...を追加して、再びテーブルを使用して、それは状態'na'
になります。
あなたは追加する必要がありますこの質問の文脈は、誰にでも役立つはるかに多くあります。 – Marcin
この本を意味しますか:[アルゴリズムの紹介](http://www.google.co.jp/url?sa=t&rct=j&q=STRING+ALGORITHMS+Cormen,+Leiserson,+Rivest+book+mcgraw+hill&source =ウェブ&CD = 1&VED = 0CB4QFjAA&URL =のhttp%3A%2F%2Fbooks.google.co.in%2Fbooks%2Fabout%2FIntroduction_to_algorithms.html%3Fid%3DwHHDQgAACAAJ&EI = NOMGT5zUOoKViQfi7siuCQ&USG = AFQjCNGQ3aAs5_zZAaZaRgywOFquDP8gXQ&SIG2 = _RcvwlIv42K9TqU6e6d61A)? –
はい、本はCormenによるアルゴリズム入門など – venkysmarty