因为效率的问题,写Delphi下的求子串的KMP&BM算法,为我的程序提速不少

{ Implementation of KMP&BM Algorithm In Delphi 7} unit Unit1; interface uses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  Dialogs, StdCtrls; type  TForm1 = class(TForm)    Button1: TButton;    Edit1: TEdit;    Edit2: TEdit;    procedure Button1Click(Sender: TObject);  private   { Private declarations }  public   { Public declarations }    function mypos(SubStr: string; MainStr: string): integer;  end; var  Form1: TForm1; implementation{$R *.dfm} function TForm1.mypos(SubStr: string; MainStr: string): integer; var  StrNext: array of integer;  i, j: integer;  procedure get_next(SubStr: string);  var    tj, tk: integer;  begin    tj := 1; tk := 0;    while tj < Length(SubStr) do    begin      if (tk = 0or (SubStr[tj] = SubStr[tk]) then      begin        tj := tj + 1; tk := tk + 1;        StrNext[tj] := tk;      end      else tk := StrNext[tk];    end;  end; begin  SetLength(StrNext, Length(SubStr) + 1);  get_next(SubStr);  Result := 0;  i := 1; j := 1;  while (i <= Length(MainStr)) and (j <= Length(SubStr)) do  begin    if (j = 0or (MainStr[i] = SubStr[j]) then    begin      i := i + 1; j := j + 1;    end    else j := StrNext[j];                                  //j:=StrNext.IndexOf(j)  ;    if j > Length(SubStr) then Result := i - Length(SubStr);  end; end; procedure TForm1.Button1Click(Sender: TObject); begin  ShowMessage(IntToStr(mypos(Edit1.text, Edit2.text))); end; end. { Implementation of BM Algorithm In Delphi 7} Function myPos(SubStr, MainStr: String): Integer;       //BM Var   i, j, k, m, n: Integer;   skip: Array[0..255Of Integer; Begin   m := Length(SubStr);   n := Length(MainStr);   If (m = 0Or (n = 0Then   Begin     Result := 0;     Exit;   End;   For k := 0 To 255 Do     skip[k] := m; //*** Preprocessing ***   For k := 1 To m - 1 Do     skip[Ord(SubStr[k])] := m - k;   Result := 0;   k := m;    //*** Searching ***   While (k <= n) Do   Begin     i := k;     j := m;     While (j >= 1Do       If MainStr[i] <> SubStr[j] Then         j := -1       Else       Begin         Dec(j);         Dec(i);       End;     If j = 0 Then     Begin       Result := i + 1;       Exit;     End;     Inc(k, skip[Ord(MainStr[k])]);   End; End; 

你可能感兴趣的:(Delphi)