![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
вообщем имеется ричэдит
нужно реализовать алгоритм поиска кнута-морриса-пратта.. мучаюсь с ним мучаюсь.. проверяет находится ли образец в строке и выделяет найденный образец ..НО только в первой строке и только если образец встречается в строке один раз нужно как то сделать чтобы он выделял по всем строкам, ну и в случае если образец находится несколько раз в одной строке помогите кто чем может, я помогу вам вот мой корявенький код: Код:
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; |
|
#2
|
|||
|
|||
|
В RichEdit в качестве текста вставлял твой же код. Находит все че хочешь
Код:
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.Text;
for i:=0 to length(ss)-1 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;
Perform(EM_SCROLLCARET,0,0); //это для прокрутки (если найденное слово вне видимой области)
SelLength:= Length(sss);
end;
k:=P[k];
sleep(400); //это чтобы успеть посмотреть,
//как выделяется найденное
end;
end;
{end;}
end;Последний раз редактировалось ЖабаДушитКота, 03.12.2010 в 00:35. |