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