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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.11.2009, 15:26   #1
Ветас
Пользователь
 
Регистрация: 09.11.2007
Сообщений: 45
По умолчанию Просьба помочь разобраться с поиском в строке по алгоритму Бойера-Мура

Здравствуйте, уважаемые форумчане.

Пытаюсь реализовать программу на Паскале, которая будет подсчитывать количество вхождений символов подстроки в строке.

Код:
function BMSearch(StartPos: Integer; const S, P: String): Integer;
type
TBMTable = array[0..255] of Integer;
var
Pos, lp, i: Integer;
BMT: TBMTable;
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;

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 bmsearch{Result} := Pos; Exit; end else
for i := lp - 1 downto 1 do if P[i] <> S[Pos - lp + i] then
 begin
   Inc(Pos);
     Break;
      end else if i = 1 then
       begin
         {Result}bmsearch := Pos - lp + 1;
           Exit;
            end;
            {Result}bmsearch := 0;

            end;

var i: integer;
s,p:string[30];
begin
  writeln('Введите строку:');readln(s);
  writeln;
  writeln('Введите подстроку:');readln(p);
  i := bmsearch(1,s,p);
  writeln(i);

  readln;
end.
Но программа ищет лишь первое вхождение символов подстроки в строке.
Подскажите, пожалуйста, какое условие необходимо добавить, чтобы дальше продолжался поиск символов подстроки в строке ?
Ветас вне форума Ответить с цитированием
Старый 16.11.2009, 18:52   #2
dexterua
Пользователь
 
Регистрация: 16.11.2009
Сообщений: 24
По умолчанию

Код:
function BMSearch(StartPos: Integer; const S, P: String): Integer;
type
TBMTable = array[0..255] of Integer;
var
  Pos, lp, i,kol: Integer;
  BMT: TBMTable;
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;

var i: integer;
s,p:string[30];
begin
writeln('Введите строку:');readln(s);
writeln;
writeln('Введите подстроку:');readln(p);
i := bmsearch(1,s,p);
writeln(i);

readln;
 end.
Ну например вот так, надо то просто не завершать функцию, а дать ей крутится увеличивая количество.
dexterua вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Просьба помочь разобраться почему значения попадают в Memo Ветас Помощь студентам 7 12.11.2009 11:27
Просьба помочь с задачей. kry Паскаль, Turbo Pascal, PascalABC.NET 9 11.01.2009 13:53
Просьба помочь новичку со списками. cbst Общие вопросы C/C++ 4 13.06.2008 19:32