我想在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),内联实际上会使它变得有点慢.