Вверх ↑
Разработчик
Ответов: 4698
Рейтинг: 426
#1: 2010-04-22 15:38:02 ЛС | профиль | цитата
nesco писал(а):
Но это нарушение алгоритма

Так мы гонимся не за соблюдением алгоритма, а за скоростью, а тут как раз смещение сразу, без лишних проверок, а значит быстрее
------------ Дoбавленo в 15.38:
Я поменял (а точнее изменил) только одну строчку, вот код, который я для себя написал (по твоему коду) для тренировки:
#pas
function PosEx(const SubStr,Str:string; const offset:cardinal = 1):cardinal;
var ln,p,i:integer;
bmt:array[0..255] of integer;
begin
ln := length(SubStr);
for i := 0 to 255 do bmt[i] := ln;
for i := ln downto 1 do
if bmt[ord(SubStr[i])] = ln then bmt[ord(SubStr[i])] := ln - i;
Result := 0;
p := integer(offset) + ln - 1;
while p <= length(Str) do
if SubStr[ln] <> Str[p] then p := p + bmt[ord(Str[p])]
else for i := ln downto 1 do
if SubStr[i] <> Str[p - ln + i] then begin
p := p + bmt[ord(Str[p - ln + i])] - i + 1; //тута
break;
end else if i = 1 then begin
Result := p - ln + 1;
exit;
end;
end;
И он работает
карма: 10
0