• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

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

原作者: [db:作者] 来自: [db:来源] 收藏 邀请
{ 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;

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
MATLABappdesigner菜鸟进阶学习(二)发布时间:2022-07-18
下一篇:
在matlab中读取trc文件发布时间:2022-07-18
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap