How can I compute a difference between two strings?
delphi, pascal, string
Solution
Fast and compact implementation.
About 3 times as fast as smasher's implementation with normal strings. More than 100 times as fast if one of the strings is empty.
Smasher's function is case insensitive though, which can be useful as well.
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;
Note: the `inline` directive reduces the execution time to less than 70% on my machine, but only for the win32 target platform. If you compile to 64bits (Delphi XE2), inlining actually makes it a tiny bit slower.
Problem
I want to create a function in Delphi that computes different levels of two strings. If two strings are equal (ignoring case), then it should return 0, but if they are not equal, it should return the number of different characters. This function can be very useful for checking spelling. ``` function GetDiffStringLevel(S1,S2:string):Integer; begin if SameText(S1,S2) then Exit(0); // i want get different chars count end ``` samples code: ``` 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 ```