Woher hast du denn diese Methode? Abgesehen davon, dass da diverse Variablen nicht initialisiert wurden und die Einrückung komplett chaotisch ist, fehlen da mindestens ein paar begins und ends. Die Schleifen und If-Konstrukte laufen irgendwie ins Leere.
Und das wichtigste: Das ist nicht Boyer-Moore, allenfalls eine Variante von Boyer-Moore-Horspool. Da fehlt nämlich die Good-Suffix-Strategie
Hier mal eine Implementierung von mir - die Good-Suffix-Regel ist auskommentiert.
Delphi-Quellcode:
function Search_BM(t,p: String): Integer;
var BC: Array[Char] of Integer;
j, k, m, n: Integer;
c: Char;
// j: Durchlaufvariable für das Muster
// k: Durchlaufvariable für den Text
// m: Musterlänge
// n: Textlänge
begin
m := Length(p);
n := Length(t);
// Vorbereitung
for c := low(char) to High(Char) do BC[c] := m;
for j := 1 to m do BC[p[j]] := m-j;
(* GS := PreProcess_BM_GoodSuffix(p); *)
// Suche
k := m;
result := 0;
while k <= n do
begin
j := 0;
while (j < m) and (p[m-j] = t[k-j]) do
inc(j);
if (j = m) then
begin
result := k-j + 1;
break;
// Falls weitere Vorkommen gesucht werden sollen:
// statt break:
// Vorkommen "irgendwie ausgeben" und
// k := k + m; //alle nicht überlappenden Vorkommen finden
// k := k + 1; //alle Vorkommen finden
end else
k := k + (*max( GS[m-j],*) max(1, BC[t[k-j]] - j) (*)*);
end;
Noch ein Edit: Tu dir selbst einen Gefallen, und lies
nicht den deutschen Wikipedia-Artikel zu diesem Algorithmus. Die Good-Suffix-Regel ist dort unvollständig, und bei dieser Beschreibung des Algos ist die Laufzeit von O(n) im Worst-Case falsch (die ist dann nämlich O(nm)). Diesen Wiki-Artikel kann man komplett in die Tonne kloppen. Der englische ist schon besser - und da steht ne Qualitätswarnung bei.