文字列の中子列の個数を判断する関数

1628 ワード



unit Unit1;



interface



uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs;



type

  TForm1 = class(TForm)

    procedure FormCreate(Sender: TObject);

  end;



var

  Form1: TForm1;



implementation



{$R *.dfm}



{ }

function GetSubStrNum(SubStr,Str: string): Integer;

begin

  Result := 0;

  while Pos(SubStr, Str) > 0 do

  begin

    Str := Copy(Str, Pos(SubStr,Str)+1, Length(Str));

    Inc(Result);

  end;

end;



{ }

procedure TForm1.FormCreate(Sender: TObject);

var

  s1,s: string;

begin

  s1 := ' ';

  s := ' ';

  ShowMessage(IntToStr(GetSubStrNum(s1,s))); {3}

end;



end.


 
   
再最適化:


function GetSubStrNum(const SubStr,Str: WideString): Integer;

var

  pw: PWideChar;

  i,SubLen: Integer;

begin

  Result := 0;

  pw := PWideChar(Str);

  SubLen := Length(SubStr);

  while i > 0 do

  begin

    i := Pos(SubStr, pw);

    Inc(pw, i - 1 + SubLen);

    if Boolean(i) then Inc(Result);

  end;

end;


 
   

これは「道法自然」兄のコードです.


function GetSubStrNum(const SubStr, Str: widestring ): Integer;

var

  i,x: Integer;

  Len,LenSubStr: Integer;

begin

  Result := 0;

  i := 1;

  LenSubStr := Length(SubStr);

  Len := Length(Str) - LenSubStr + 1;

  while i <= Len do

  begin

    if Str[i] = SubStr[1] then

    begin

      x := 1;

      while (x < LenSubStr) and (Str[i+x] = SubStr[x+1]) do Inc(x);

      if (x = LenSubStr) then Result := Result + 1;

      Inc(i,x);

    end else Inc(i);

  end;

end;