Levenshtein distance: Difference between revisions

m
→‎{{header|Phix}}: reworked/tidied, added alternative
(Added generic ISO C++ solution)
m (→‎{{header|Phix}}: reworked/tidied, added alternative)
Line 3,768:
 
=={{header|Phix}}==
Copy of [[Levenshtein_distance#Euphoria|Euphoria]]
<lang Phix>requires("0.8.2")
 
function levenshtein(sequencestring s1a, s2b)
integer n = length(s1a)+1,
m = length(s2b)+1
if n=0 then return n-1m end if
if nm=1 0 then return n end if
sequence d = returnrepeat(repeat(0, m-+1), n+1)
elsif m=1 then
return n-1
end if
sequence d = repeat(repeat(0, m), n)
 
for i=1 to n do
d[i+1][1] = i-1
end for j=1 to m do
d[i1][j+1] = min({j
-- next := min({ prev +substitution, deletion, or insertion }):
for j=1 to m do
d[i+1][j+1] = min({d[i][j-]+(a[i]!=b[j]), d[i][j+1]+1, d[i+1][j]+1})
end for
for i=2 to n do
for j=2 to m do
d[i][j] = min({
d[i-1][j]+1,
d[i][j-1]+1,
d[i-1][j-1]+(s1[i-1]!=s2[j-1])
})
end for
end for
return d[n$][m$]
return d[n][m]
end function
 
Line 3,833 ⟶ 3,816:
"" <== 0 ==> ""
</pre>
 
=== alternative ===
(modelled after the Processing code, uses a single/smaller array, passes the same tests as above)
<lang Phix>function levenshtein(string a, b)
sequence dcosts = repeattagset(repeatlength(0, mb)+1, n0)
for ji=1 to mlength(a) do
costs[1] = i
integer newcost = i-1, pj = i, cj
for ij=21 to nlength(b) do
cj = d[i-1]costs[j]+1,]
pj = min({pj+1, cj+1, newcost+(a[i]!=b[j])})
{costs[j+1],newcost} = {pj,cj}
end for
end iffor
return costs[$-1]
end function</lang>
 
=={{header|PHP}}==
7,820

edits