Текущий архив: 2002.06.24;
Скачать: CL | DM;
Вниз
Очередная несложная разминка для начинающих. Найти похожие ветки
← →
igorr © (2002-05-21 16:36) [40]Опять опоздал :))
Вот мой вариант с исключением завершающих символов.
function Pal(var Str:String):Boolean;
var
i,FinPos:integer;
ReverseStr:string;
begin
Str:=UpperCase(Str);
for i:=Length(Str) downto 1 do
if Str[1]=Str[i] then begin
FinPos:=i;
Break;
end;
SetLength(ReverseStr,FinPos);
for i:=1 to FinPos do ReverseStr[i]:=Str[FinPos-i+1];
Result:=Pos(ReverseStr,Str)<>0;
if FinPos<5 then Result:=False; //ограничение длины палиндрома
end;
← →
xGrey © (2002-05-21 16:46) [41]Вариант с искл. знаков препинания:
function PalendromValidate(StrUser: string): boolean;
const cst="’!?,.- ";
var StrTemp : string;
i : integer;
begin
for i :=1 to Length(cst) do
StrUser:=AnsiLowerCase(StringReplace(StrUser,cst[i],"",[rfReplaceAll]));
SetLength(StrTemp,Length(StrUser));
for i :=Length(StrUser) downto 1 do
StrTemp[Length(StrUser)-i+1]:=StrUser[i];
result:=StrTemp=StrUser;
end;
← →
ION T © (2002-05-21 17:02) [42]Попытка оптимизации своего первого метода:
function IsPalindrome(InStr: string; out Time: int64): boolean;
const delim: set of char= [" ", "-", ",", ".", "!", "?", "(", ")", ":", ";"];
var inv: array of char;
i, j: integer;
Start, Stop: int64;
begin
QueryPerformanceCounter(Start);
InStr:= AnsiLowerCase(InStr);
i:= length(InStr); j:= 0;
SetLength(inv, i);
for i:= i downto 1 do
begin
if InStr[i] in delim then
delete(InStr, i, 1) else
begin
inv[j]:= InStr[i];
inc(j);
end;
end;
i:= length(InStr) div 2;
SetLength(inv, i);
if copy(InStr, 1, i)= string(inv) then Result:= true else Result:= false;
QueryPerformanceCounter(Stop);
Time:= Stop- Start;
end;
У меня Time на выходе ~63t
А вот оптимизация Ромкиного метода:
function IsPalindrome(InStr: string; out Time: int64): boolean;
const delim: set of char= [" ", "-", ",", ".", "!", "?", "(", ")", ":", ";"];
var i, j, k: integer;
Start, Stop: int64;
begin
QueryPerformanceCounter(Start);
Result:= true;
InStr:= AnsiLowerCase(InStr);
j:= 1; k:= length(InStr);
for i:= 1 to k div 2 do
begin
while InStr[j] in delim do inc(j);
while InStr[k] in delim do dec(k);
if InStr[j]<> InStr[k] then
begin
Result:= false;
break;
end;
end;
QueryPerformanceCounter(Stop);
Time:= Stop- Start;
end;
Time~33t
Эх, КвикСорт он и в Индии КвикСорт;)
Страницы: 1 2 вся ветка
Текущий архив: 2002.06.24;
Скачать: CL | DM;
Память: 0.54 MB
Время: 0.019 c