2013-11-27 98 views

回答

5

你需要计算Levenshtein距离(也称为编辑距离),这被定义为跟随字符串ab:(从Wikipedia拍摄):

enter image description here

因为列夫(值我,j)只依赖于以前的值,我们可以利用Haskell的懒惰来初始化一个Array,其中位置(i,j)处的元素值是同一个数组的先前值的函数!请参阅Dynamic programming example以查看如何完成此操作的示例。

这里去一个基本实施lev

import Data.Array 

lev :: String -> String -> Int 
lev x y = c ! (m, n) 
    where 
    c = listArray ((0, 0), (m, n)) [compute i j | i <- [0 .. m], j <- [0 .. n]] 
    compute 0 j = j 
    compute i 0 = i 
    compute i j 
     | x !! (i - 1) == y !! (j - 1) = c ! (i - 1, j - 1) 
     | otherwise = 1 + (minimum $ map (c !) [(i , j - 1), 
               (i - 1, j), 
               (i - 1, j - 1)]) 
    m = length x 
    n = length y 

该代码可以进一步优化,但应该给你上手是一个好主意。

在计算Levenshtein之后,您只需要将其与编辑成本界限k进行比较。

+0

谢谢先生..这有助于。 – user3041551

+0

@ user3041551对不起,你真正需要的是Levenshtein距离而不是LCS。我总是混淆他们两个,我的不好。我编辑了我的答案。 –

+0

谢谢佩德罗罗德里格斯先生,感谢您的帮助。 – user3041551