我正在玩 f sharp 中的 KMP 算法。虽然它适用于 "ATAT" 之类的模式(结果将是 [|0; 0; 1; 2;|]),但当字符串的前 2 个字符相同且第三个字符是另一个时,第一个 while 循环进入死锁,例如“AAT”。
我明白为什么:首先,i 递增到 1。现在 while 循环的第一个条件为真,而第二个条件也为真,因为“A”<>“T”。现在它将 i 设置为 prefixtable.[!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