local function min(a, b, c) local min_val = a if b < min_val then min_val = b end if c < min_val then min_val = c end return min_val end ---------------------------------- --- Levenshtein distance function. -- @tparam string s1 -- @tparam string s2 -- @treturn number the levenshtein distance -- @within Metrics return function(s1, s2) if s1 == s2 then return 0 end if s1:len() == 0 then return s2:len() end if s2:len() == 0 then return s1:len() end if s1:len() < s2:len() then s1, s2 = s2, s1 end local t = {} for i=1, #s1+1 do t[i] = {i-1} end for i=1, #s2+1 do t[1][i] = i-1 end local cost for i=2, #s1+1 do for j=2, #s2+1 do cost = (s1:sub(i-1,i-1) == s2:sub(j-1,j-1) and 0) or 1 t[i][j] = min( t[i-1][j] + 1, t[i][j-1] + 1, t[i-1][j-1] + cost) end end return t[#s1+1][#s2+1] end