您现在的位置:首页 >> 基础算法 >> window基础 >> 内容

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

时间:2011/9/3 15:28:10 点击:

  核心提示:用百分比比较两个字符串(彼此之间有多少相似度)返回 byte类型,从0到 100%functionCompareStringsInPercent(Str1,Str2:string):Byte;type...

用百分比比较两个字符串(彼此之间有多少相似度)
返回 byte 类型,从 到 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 := 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 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 then Dec(IndexB);
      end
      else 
        
Inc(IndexB);
    end;
  end;
  // Calculating simularity percentage
  
LengthStr := Min(Length(PatternA), Length(PatternB));
  for IndexA := 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]) 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;

作者:网络 来源:转载
共有评论 0相关评论
发表我的评论
  • 大名:
  • 内容:
  • 盒子文章(www.2ccc.com) © 2022 版权所有 All Rights Reserved.
  • 沪ICP备05001939号