加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

如何计算两个字符串之间的差异?

发布时间:2020-12-15 10:13:25 所属栏目:大数据 来源:网络整理
导读:我想在Delphi中创建一个函数来计算两个字符串的不同级别.如果两个字符串相等(忽略大小写),则它应返回0,但如果它们不相等,则应返回不同字符的数量.此功能对于检查拼写非常有用. function GetDiffStringLevel(S1,S2:string):Integer;begin if SameText(S1,S2)
我想在Delphi中创建一个函数来计算两个字符串的不同级别.如果两个字符串相等(忽略大小写),则它应返回0,但如果它们不相等,则应返回不同字符的数量.此功能对于检查拼写非常有用.
function GetDiffStringLevel(S1,S2:string):Integer;
begin
  if SameText(S1,S2) then Exit(0);
  // i want get different chars count
end

样品代码:

Diff:=GetDiffStringLevel('Hello','Hello');// Diff:=0;
Diff:=GetDiffStringLevel('Hello','2Hello');// Diff:=1;
Diff:=GetDiffStringLevel('Hello','H2ello');// Diff:=1;
Diff:=GetDiffStringLevel('Hello','Hello W');// Diff:=2;
Diff:=GetDiffStringLevel('Hello','World');// Diff:=6; or 5

解决方法

快速紧凑的实施.

大约是smasher使用普通字符串实现的3倍.
如果其中一个字符串为空,则速度超过100倍.

Smasher的函数虽然不区分大小写,但也很有用.

function LevenshteinDistance(const s,t: string): integer;inline;
var
  d   : array of array of integer;
  n,m,i,j : integer;
begin
  n := length(s);
  m := length(t);
  if n = 0 then Exit(m);
  if m = 0 then Exit(n);

  SetLength(d,n + 1,m + 1);
  for i := 0 to n do d[i,0] := i;
  for j := 0 to m do d[0,j] := j;

  for i := 1 to n do
    for j := 1 to m do
      d[i,j] := Min(Min(d[i-1,j]+1,d[i,j-1]+1),d[i-1,j-1]+Integer(s[i] <> t[j]));

  Result := d[n,m];
end;

注意:内联指令将我的计算机上的执行时间减少到不到70%,但仅适用于win32目标平台.如果编译为64位(Delphi XE2),内联实际上会使它变得有点慢.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读