zoukankan      html  css  js  c++  java
  • Delphi中比较两个字符串相似性的百分比算法

    用百分比比较两个字符串(彼此之间有多少相似度)
    返回 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 ;

  • 相关阅读:
    file_get_contents抓取远程URL内容
    Xshell下VI打开文件中文乱码解决
    YII实现Memcache故障转移的配置办法
    Nginx实现多重IF判断的办法
    CentOS安装NodeJS v0.10.25 + Express
    一个小玩意 PHP实现微信红包金额拆分试玩
    Web Service测试利器 Postman
    CentOS安装Git
    PHP导出CSV UTF-8转GBK不乱码的解决办法
    configure: error: C++ compiler cannot create executables
  • 原文地址:https://www.cnblogs.com/ljl_falcon/p/2405968.html
Copyright © 2011-2022 走看看