Var n,i,j:Integer;
Begin
n:=Length(P);
Fl[1]:=0;
For i:=2 To n Do
Begin
j:=Fl[i-1];
While (j<>0) And (P[j]<>P[i-1]) Do j:= Fl[j];
Fl[i]:=j+1;
End;
End;

????????: ?????? ????? ?????? ????????? ???????, ???? ? ??? ???????????? ????????? ????? ??, ??-??????, ?????????? ???????-??????? ?????????? ????? m ???, ????????? ????? ???????? ?????????? k. ??? ??? ? ????? while ??? ??????????? (P[k]<k), ?? ?? ?????????? ?????? 0, ?? ??????????? ??? ????? ?? ????, ??? ??????????. ?????????? k ?????????? ?? 1 ?? ????? m ???. ??????, ?????????? k ???????? ????? ?? ????? 2m ???. ???????, ??? ????? ?????? ???? ????????? ???? O(m) [1, 2].
? ?????? ?? ????????? ? ?????? ?????????, ??????? ????????? ? ?????? (??????? 4).
Function KMPSearch(S,P:String):Integer;
{ Алгоpитм Кнута-Моpиса-Пpатта, устанавливающий }
{ вхождение непустой стpоки P в стpоку S }
Var Fl:TMas;
i,j,n,m:Integer;
Begin
n:=Length(S);
m:=Length(P);
PrefFunc(P,Fl);
j:=1;
For i:=1 To n Do
begin
While (j<>0) And (P[j]<>S[i]) do j:=Fl[j];
If j=m Then Break;
j:=j+1
end;
If (j=m) then Result:=i-j+1 Else Result:=0;
End; | |
К-во Просмотров: 509
Бесплатно скачать Курсовая работа: Алгоритмы поиска подстроки в строке