program searching_samples; { Suchen in Zeichenfolgen } uses crt; const maxlength_of_Muster = 10; var a,p : string; m,n : integer; next : array[1..maxlength_of_Muster] of integer; procedure lies_strings; begin writeln(' *** Suchen in Zeichenfolgen *** '); writeln;writeln; write('Text-String = '); readln(a); N:=length(a); write('Muster = '); readln(p); M:=length(p); writeln;writeln; end; function brutesearch(start:integer) :integer; (* gibt 0 zurÜck bei Nichtauftreten des Musters im Text A *) var i,j :integer; begin i:=start; j:=1; repeat if a[i]=p[j] then begin i:=i+1; j:=j+1 end else begin i:=i-j+2; j:=1 end; until (j>m) or (i>n); if j>m then brutesearch:=i-m else brutesearch:=0 end; procedure init_next; var i,j : integer; begin i:=1; j:=0; next[1]:=0; repeat if (j=0) or ( p[i]=p[j] ) then begin i:=i+1; j:=j+1; next[i]:=j; end else j:=next[j]; until i>=M; end; function kmpsearch(start:integer) :integer; var i,j : integer; begin i:=start; j:=1; if i=1 then init_next; repeat if (j=0) or ( a[i]=p[j] ) then begin i:=i+1; j:=j+1 end else j:=next[j]; until (j>M) or (i>N); if j>M then kmpsearch:=i-m else kmpsearch:=0; end; (********************************* Main **********************************) var s : integer; flag : boolean; begin clrscr; lies_strings; for s:=1 to maxlength_of_muster do next[s]:=0; writeln('**************** Brute-Search ****************'); writeln;writeln; flag:=false; s:=0; repeat s:=brutesearch(s+1); if s<>0 then begin writeln('Das Muster "',p,'" kommt im Text A in der ',s,'. Stelle vor ! '); flag:=true; end; until s=0; if not flag then writeln('Das Muster "',p,'" kommt im Text A nicht vor ! '); readln; writeln('**************** KMP-Search ****************'); writeln;writeln; flag:=false; s:=0; repeat s:=kmpsearch(s+1); if s<>0 then begin writeln('Das Muster "',p,'" kommt im Text A in der ',s,'. Stelle vor ! '); flag:=true; end; until s=0; if not flag then writeln('Das Muster "',p,'" kommt im Text A nicht vor ! '); readln; end.