您的位置:首页 > 编程语言 > Delphi

Delphi中比较两个字符串相似性的百分比算法

2010-07-27 20:47 399 查看
用百分比比较两个字符串(彼此之间有多少相似度)

返回 byte 类型,从 0 到 100%

function
CompareStringsInPercent(Str1, Str2: string
): Byte;

type


TLink = array
[0..1] of
Byte;

var


tmpPattern: TLink;

PatternA, PatternB: array of
TLink;

IndexA, IndexB, LengthStr: Integer;

begin


Result := 100;

// Building pattern tables

LengthStr := Max(Length(Str1), Length(Str2));

for
IndexA := 1 to
LengthStr do

begin

if

Length(Str1) >= IndexA then

begin


SetLength(PatternA, (Length(PatternA) + 1));

PatternA[Length(PatternA) - 1][0] := Byte(Str1[IndexA]);

PatternA[Length(PatternA) - 1][1] := IndexA;

end
;

if
Length(Str2) >= IndexA then

begin


SetLength(PatternB, (Length(PatternB) + 1));

PatternB[Length(PatternB) - 1][0] := Byte(Str2[IndexA]);

PatternB[Length(PatternB) - 1][1] := IndexA;

end
;

end
;

// Quick Sort of pattern tables

IndexA := 0;

IndexB := 0;

while
((IndexA < (Length(PatternA) - 1)) and
(IndexB < (Length(PatternB) - 1))) do

begin

if

Length(PatternA) > IndexA then

begin

if

PatternA[IndexA][0] < PatternA[IndexA + 1][0] then

begin


tmpPattern[0] := PatternA[IndexA][0];

tmpPattern[1] := PatternA[IndexA][1];

PatternA[IndexA][0] := PatternA[IndexA + 1][0];

PatternA[IndexA][1] := PatternA[IndexA + 1][1];

PatternA[IndexA + 1][0] := tmpPattern[0];

PatternA[IndexA + 1][1] := tmpPattern[1];

if
IndexA > 0 then
Dec(IndexA);

end

else


Inc(IndexA);

end
;

if
Length(PatternB) > IndexB then

begin

if

PatternB[IndexB][0] < PatternB[IndexB + 1][0] then

begin


tmpPattern[0] := PatternB[IndexB][0];

tmpPattern[1] := PatternB[IndexB][1];

PatternB[IndexB][0] := PatternB[IndexB + 1][0];

PatternB[IndexB][1] := PatternB[IndexB + 1][1];

PatternB[IndexB + 1][0] := tmpPattern[0];

PatternB[IndexB + 1][1] := tmpPattern[1];

if
IndexB > 0 then
Dec(IndexB);

end

else


Inc(IndexB);

end
;

end
;

// Calculating simularity percentage

LengthStr := Min(Length(PatternA), Length(PatternB));

for
IndexA := 0 to
(LengthStr - 1) do

begin

if

PatternA[IndexA][0] = PatternB[IndexA][0] then

begin

if

Max(PatternA[IndexA][1], PatternB[IndexA][1]) - Min(PatternA[IndexA][1],

PatternB[IndexA][1]) > 0 then
Dec(Result,

((100 div
LengthStr) div
(Max(PatternA[IndexA][1], PatternB[IndexA][1]) -

Min(PatternA[IndexA][1], PatternB[IndexA][1]))))

else if
Result < 100 then
Inc(Result);

end

else


Dec(Result, (100 div
LengthStr))

end
;

SetLength(PatternA, 0);

SetLength(PatternB, 0);

end
;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: