![]() |
|
|
Регистрация | << Правила форума >> | 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. |