私はKシャープでKMPアルゴリズムを使いこなしています。 "ATAT"(結果は[| 0; 0; 1; 2; |])のようなパターンで動作しますが、最初のwhileループは文字列の最初の2文字が同じで、3文字目が別の場合例えば、 "AAT"とする。FシャープKMPアルゴリズムは、最初の2つのインデクスで同じ文字のパターンを使用すると、最初のwhileループでスタックされます
私は理解しています:最初に、私は1に増えます。今度は "A" <> "T"のため、whileループの最初の条件は真です。今度は私に接頭辞テーブル[!i]を設定します。これはもう一度1で、ここに行きます。
あなたは私にこれを解決するためのヒントを教えてもらえますか?
let kMPrefix (pattern : string) =
let (m : int) = pattern.Length - 1
let prefixTable = Array.create pattern.Length 0
// i : longest proper prefix that is also a suffix
let i = ref 0
// j: the index of the pattern for which the prefix value will be calculated
// starts with 1 because the first prefix value is always 0
for j in 1 .. m do
while !i > 0 && pattern.[!i] <> pattern.[j] do
i := prefixTable.[!i]
if pattern.[!i] = pattern.[j] then
i := !i+1
Array.set prefixTable j !i
prefixTable
以前はKnuth-Morris-Prattアルゴリズムを使用していませんでしたが、https://en.wikipedia.org/wiki/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithmは、最初のインデックスは、0ではなく-1にする必要があります。これは、文字列の最初の部分での不一致が特殊なケースであるためです。それはあなたの問題を解決するだろうか? – rmunn