您的位置:首页 > 其它

Levenshtein distance最小编辑距离算法实现

2017-03-13 22:10 281 查看

动态编程| (编辑距离)

给定两个字符串str1和str2以及可以对str1执行的操作。找出将“str1”转换为“str2”所需的最小编辑次数(操作)。

插入

删除

代替

所有上述操作具有相等的成本。



例子:


输入:str1 =“geek”,str2 =“gesek”
输出:1
我们可以通过插入一个's'将str1转换为str2。

输入:str1 =“cat”,str2 =“cut”
输出:1
我们可以通过将'a'替换为'u'来将str1转换为str2。

输入:str1 =“sunday”,str2 =“saturday”
输出:3
最后三个字符和第一个字符相同。我们基本上
需要将“un”转换为“ atur ”。这可以使用
以下三个操作来完成。
将“n”替换为“r”,插入t,插入a

这种情况下的子问题是什么?

这个想法是从两个字符串的左侧或右侧逐个处理所有字符。

让我们从右边角度穿越,对于每一对字符都有两种可能性。

m: str1(第一个字符串)的
长度n: str2(第二个字符串)的长度


如果两个字符串的最后字符相同,没有什么可做的。忽略最后一个字符并获取剩余字符串的计数。因此,我们重复长度m-1和n-1。

Else(如果最后字符不相同),我们考虑对“str1”的所有操作,考虑对第一个字符串的最后一个字符的所有三个操作,递归计算所有三个操作的最小成本,并取最少三个值。

插入:对m和n-1重复

删除:重复m-1和n

替换:对m-1和n-1重复

下面是上面Naive递归解的Java实现。

Java

在IDE上运行

输出:

3

上述解的时间复杂度是指数的。在最坏的情况下,我们可能最终做O(3 m)操作。最坏的情况发生在两个字符串的字符都不匹配时。下面是最坏情况下的递归调用图。





我们可以看到,许多子问题被一次又一次解决,例如eD(2,2)被称为三次。由于相同的suproblems被再次调用,这个问题具有重叠子属性。因此,编辑距离问题具有动态规划问题的属性(见这个这个)。像其他典型的动态编程(DP)问题一样,通过构造存储子参数结果的临时数组,可以避免重新计算相同的子问题。

Java

Java

在IDE上运行
spaces”>
dp[i
-
1
][j
-
1
])
# Replace
Run on IDE
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息