Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.11.2012, 17:14   #1
gylayko
Форумчанин
 
Регистрация: 14.09.2011
Сообщений: 203
По умолчанию в строке найти подстроку

нужно с помощью алгоритма Бойера-Мура найти в строке подстроку.
Код:
type
TBMTable = array[0..255] of Integer;
  TForm1 = class(TForm)
    Memo1: TMemo;
    Edit1: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Memo2: TMemo;
    Label3: TLabel;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  T: TBMTable;

implementation

{$R *.dfm}
procedure MakeBMTable( var BMT : TBMTable; const P : String);
var
  i : Integer;
begin
  for i := 0 to 255 do BMT[i] := Length(P);
    for i := Length(P) downto 1 do
      if BMT[Byte(P[i])] = Length(P) then
        BMT[Byte(P[i])] := Length(P) - i;
end;

function BMSearch(StartPos: Integer; const S, P: String; BMT: TBMTable): Integer;
var
  Pos, lp, i,kol: Integer;
begin

  kol:=0;
  for i := 0 to 255 do BMT[i] := Length(P);
  for i := Length(P) downto 1 do if BMT[Byte(P[i])] = Length(P) then
  BMT[Byte(P[i])] := Length(P) - i;

  lp := Length(P);
  Pos := StartPos + lp -1;
  while Pos <= Length(S) do
  if P[lp] <> S[Pos] then Pos := Pos + BMT[Byte(S[Pos])] else
  if lp = 1 then
  begin
    inc(kol);
    inc(Pos);
  end else
  for i := lp - 1 downto 1 do
  if P[i] <> S[Pos - lp + i] then
  begin
   Inc(Pos);
  end
  else if i = 1 then
  begin
    inc(kol);
    inc(Pos);
  end;
  {Result}bmsearch := kol;
end;


procedure TForm1.Button1Click(Sender: TObject);
var i, str, pr, start, c, k: integer;
s,p,txt:string[30];
begin
s:=Memo1.Text;
p:=Edit1.Text;
i := bmsearch(1,s,p,T);
Memo2.Lines.Add('количество вхождений  '+IntToStr(i));
c:=0;
MakeBMTable( T, Edit1.Text );
str:=Length(Edit1.Text);
for k:=0 to Memo1.Lines.Count-1 do
 begin
  txt:=Memo1.Lines.Strings[k];
  start:= 1; pr:=-1;
  while pr <> 0 do
  begin
   pr := BMSearch(start, txt, Edit1.Text, T);
  if pr = 0 then break;
  Memo2.Lines.Add('строка '+IntToStr(k + 1)+' позиция '+IntToStr (pr));
  inc(start, str + pr); inc(c);
  end;

 end;
 end;

end.
в результате правильно определяет только строку, а позиция всегда 1, да еще и 2 раза. в чем ошибка?
gylayko вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Что в этих строках не так--найти количество симв., и найти в строке букву и измер. длину(2, 3 -с помощ. масивов) символ, Max11 Общие вопросы C/C++ 2 15.05.2012 08:11
Найти букву в строке antohaha JavaScript, Ajax 1 01.05.2012 11:31
Найти подстроки в строке Uniskull C# (си шарп) 2 16.03.2012 16:34
Найти цифры в строке grongost Помощь студентам 1 05.10.2010 19:20
заменить в строке подстроку Lemo Помощь студентам 4 18.10.2008 21:54