Простой собственный подход (исходя из предположения, что шаблон сохраняет одинаковую длину):
function hammingdistance(a,b)
local ta={a:byte(1,-1)}
local tb={b:byte(1,-1)}
local res = 0
for k=1,#a do
if ta[k]~=tb[k] then
res=res+1
end
end
print(a,b,res) -- debugging/demonstration print
return res
end
function fuz(s,pat)
local best_match=10000
local best_location
for k=1,#s-#pat+1 do
local cur_diff=hammingdistance(s:sub(k,k+#pat-1),pat)
if cur_diff < best_match then
best_location = k
best_match = cur_diff
end
end
local start,ending = math.max(1,best_location),math.min(best_location+#pat-1,#s)
return start,ending,s:sub(start,ending)
end
s=[[Hello, Universe! UnIvErSe]]
print(fuz(s,'universe'))
Отказ от ответственности: не рекомендуется, просто для удовольствия:
Если вам нужен лучший синтаксис (и вы не возражаете возиться с метатаблицами стандартного типа), вы можете использовать это:
getmetatable('').__sub=hammingdistance
a='Hello'
b='hello'
print(a-b)
Но обратите внимание, что a-b
не равно b-a
таким образом.
person
jpjacobs
schedule
19.10.2012