вообщем имеется ричэдит
нужно реализовать алгоритм поиска кнута-морриса-пратта..
мучаюсь с ним мучаюсь..
проверяет находится ли образец в строке и выделяет найденный образец ..НО только в первой строке и только если образец встречается в строке один раз
нужно как то сделать чтобы он выделял по всем строкам, ну и в случае если образец находится несколько раз в одной строке
помогите кто чем может, я помогу вам
вот мой корявенький код:
Код:
var
S:array[0..10000] of char;
P: array[0..10000] of word;
i,k,l1 : longint;
m :longint;
Procedure Prefix;
Begin
P[1]:=0;
k:=0;
for i:=2 to m do
begin
while (k>0) and (S[k+1]<>S[i]) do
k:=P[k];
if S[k+1]=S[i] then
k:=k+1;
P[i]:=k;
end;
End;
procedure TForm1.Button1Click(Sender: TObject);
var n : longint;
T : array[0..40000] of char;
ss,sss:string;
begin
for l1:=0 to richedit1.Lines.Count-1 do
begin
ss:= RichEdit1.Lines[l1];
for i:=0 to length(ss) do
begin
T[i]:=ss[i];
end;
sss:=Edit1.text;
for i:=0 to length(sss) do
begin
S[i]:=sss[i];
end;
m:=length(sss);
Prefix;
k:=0;
n:=length(ss);
for i:=0 to n do
begin
while (k>0) and (S[k+1]<>T[i]) do
k:=P[k];
if S[k+1]=T[i] then
k:=k+1;
if k=m then
begin
showmessage('vhodit') ;
with RichEdit1 do
begin
SetFocus;
SelStart :=i-m;
SelLength:= Length(sss);
end;
k:=P[k];
end;
end ;
end;