나는 KMP 알고리즘으로 날카롭게 놀고 있습니다. "ATAT"(결과는 [| 0; 0; 1; 2; |])와 같은 패턴에서 작동하지만 첫 번째 while 루프는 문자열의 처음 두 문자가 같고 세 번째 문자가 다른 경우 교착 상태가됩니다. 예 : "AAT".F sharp KMP 알고리즘이 처음 두 indces에서 같은 문자로 패턴을 사용하는 경우 첫 번째 while 루프에 걸렸습니다.
왜 나는 먼저 1로 증가합니다. 이제는 "A"<> "T"이기 때문에 while 루프의 첫 번째 조건은 참이고 두 번째 조건도 참입니다. 이제 i를 접두사 테이블로 설정합니다. [! 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
이전에 크 누스 - 모리스 - 프랫 알고리즘을 사용하지 않았지만 https://en.wikipedia.org/wiki/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm은 문자열의 맨 처음에 불일치가 특별한 경우이기 때문에 첫 번째 인덱스는 0이 아니라 -1이되어야합니다. 그게 당신 문제를 해결할 수 있을까요? – rmunn