{
implementation of kmp algorithm
}
program impl_kmp;
uses
crt;
const
max_strlen = 255;
var
next : array [ 1 .. max_strlen ] of integer;
str_s, str_t : string;
int_i : integer;
procedure get_nexst( t : string );
var
j, k : integer;
begin
j := 1; k := 0;
while j < length(t) do
begin
if ( k = 0 ) or ( t[j] = t[k] ) then
begin
j := j + 1; k := k + 1;
next[j] := k;
end
else k := next[k];
end;
end;
function index( s : string; t : string ) : integer;
var
i, j : integer;
begin
get_next(t);
index := 0;
i := 1; j := 1;
while ( i <= length(s) ) and ( j <= length(t) ) do
begin
if ( j = 0 ) or ( s[i] = t[j] ) then
begin
i := i + 1; j := j + 1;
end
else j := next[j];
if j > length(t) then index := i - length(t);
end;
end;
begin
clrscr;
write('s = ');
readln(str_s);
write('t = ');
readln(str_t);
int_i := index( str_s, str_t );
if int_i <> 0 then
begin
writeln( 'found ', str_t, ' in ', str_s, ' at ', int_i, '.' );
end
else
writeln( 'cannot find ', str_t, ' in ', str_s, '.' );
end.
index函数用于模式匹配,t是模式串,s是原串。返回模式串的位置,找不到则返回0