Knuth-Morris-Pratt is an Algorithm for searching a text for a string. It's a very commonly used algorithm and is very fast. TODO: write about how it works.

Here is a Delphi implementation of the kmp search algorithm.

```function kmp_search_next( const W, S: string;
const T: array of Integer): Integer;
var
m, i: Integer;
begin
i := 1;
m := 1;
while ( ( ( m + i ) <= Length( S ) ) and ( i <= Length( W ) ) ) do begin
if ( S[m + i] = W[i] ) then begin
Inc( i );
end
else begin
m := m + ( i - T[i] );
if ( i > 1 ) then
i := T[i];
end;
end;
if m = Length( S ) then
Result := 0
else
Result := m;
end;
```
```function kmp_table( W: string ): array of Integer;
var
i, j: Integer;
T: array of Integer;
begin
i := 3;
j := 1;
SetLength( T, Length( W ) + 1 );
t := 0;
```
```  if ( Length( W ) > 1 ) then
t := 1;
while ( i <= Length( W ) ) do begin
if ( W[i - 1] = W[j] ) then begin
T[i] := j + 1;
Inc( j );
Inc( i );
end
else if ( j > 1 ) then begin
j := T[j];
end
else begin
T[i] := 1;
Inc( i );
j := 1;
end;
end;
Result := T;
end;
```

Use those two functions like this:

```var
str_to_search_for: string;
str_to_search_in: string;
begin
str_to_search_for := 'Word(s)';
str_to_search_in  := 'String in which you will search for the word(s)';
kmp_search_next( str_to_search_for, str_to_search_in, kmp_table( str_to_search_for ) );
end;
```

And the result of kmp_search_next will be the position of the word you searched for. If it isn't found it will return zero.

Code Snippets
DatabasesFiles and I/OForms/WindowsGraphicsNetworkingMath and AlgorithmsMiscellaneousMultimediaSystemVCL