Ich verstehe nicht, wieso Du nicht einfach den BM-Suchalgorithmus in einen Count-Algorithmus umwandelst. Nimm das 'fehlende exit' heraus und ersetze das durch ein 'inc(Result)', wobei 'Result' mit 0 initialisiert wird. Dann kannst Du dir diese Schleife auch sparen, wo der SearchBM immer aufgerufen wird.
Das habe ich bereits gemacht im Anhang 4, Horst_ hat es noch etwas angepasst und eine überflüssige Varible (von mir) rausgeschmissen.
Delphi-Quellcode:
function Search_BMH_Count(const SuchText,SuchWort:string):integer;
var
n, k, j: integer;
Large: integer;
begin
BC := PreProcess_BMH_BC(SuchWort);
with BC do
begin
n := Length(SuchText);
Large := BMH_le + n + 1;
BMH_BC[BMH_Suchwort[BMH_le]] := Large;
k := BMH_le;
Result := 0;
while k <= n do
begin
//fast loop
repeat
j := BMH_BC[SuchText[k]];
k := k + j;
until (j = Large) or (k >= n);
//Muster/letztes Zeichen im Suchwort nicht gefunden
if j <> Large then
break;
// Letzer Buchstabe des Suchwortes im Suchtext gefunden
j := 1;
k := k - Large;
// die Buchstaben davor auf Gleichheit pruefen slow loop
while (j < BMH_le) and (BMH_Suchwort[BMH_le - j] = SuchText[k - j]) do
Inc(j);
if j = BMH_le then
begin
// Muster gefunden
Inc(Result);
k := k+1;
end
else
begin
// Muster verschieben
if SuchText[k] = BMH_Suchwort[BMH_le] then
k := k + BMH_le //BC_last;
else
k := k + BMH_BC[SuchText[k]];
end;
end;
end;
end;