mirror of
https://github.com/SpaceVim/SpaceVim.git
synced 2025-02-03 15:00:06 +08:00
53 lines
932 B
Lua
53 lines
932 B
Lua
|
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
|