Algorithm: Knuth/Morris/Pratt
/* Computation of the Border-Table */
FOR j := 1 TO m DO
sborder[j] := 0
END
j = 1
i = 2
WHILE i <= m DO
WHILE i+j-1 <= m AND pat[j] = pat[i+j-1] DO
j := j+1
IF i+j-1 <= m THEN
sborder[i+j-1] := sborder[j]
END
IF i+j-1 <= m THEN
sborder[i+j-1] := MAX(j, sborder[i+j-1]
i := i+j-sborder[j]
j := MAX(sborder[j], 1)
END
/* Algorithm: Knuth/Morris/Pratt */
i := 1
j := 1
WHILE i <= n-m+1 DO
WHILE j <= m AND pat[j] = text[i+j-1] DO
j := j+1
END
IF j = m+1 THEN RETURN TRUE
i := i+j-sborder[j]
j := MAX(sborder[j],1)
END
RETURN FALSE
Time complexity: O (n+m)
Space complexity: O(m)
Back to the Applet