10

给定 2 个字符串st. 我需要找到s编辑距离(Levenshtein 距离)中的每个子字符串到t. 实际上,我需要知道从ipositions开始的所有子字符串的最小编辑距离是多少i

例如:

t = "ab"    
s = "sdabcb"

我需要得到类似的东西:

{2,1,0,2,2}

解释:

1st position:
distance("ab", "sd") = 4 ( 2*subst )
distance("ab", "sda") = 3( 2*delete + insert )
distance("ab", "sdab") = 2 ( 2 * delete)
distance("ab", "sdabc") = 3 ( 3 * delete)
distance("ab", "sdabcb") = 4 ( 4 * delete)
So, minimum is 2

2nd position:
distance("ab", "da") = 2 (delete + insert)
distance("ab", "dab") = 1 (delete)
distance("ab", "dabc") = 2 (2*delete)
....
So, minimum is 1

3th position:
distance("ab", "ab") = 0
...
minimum is 0

等等。

当然,我可以使用蛮力算法来解决这个任务。但是有更快的算法吗?

感谢帮助。

4

2 回答 2

14

在给定字符串中查找子字符串非常容易。您采用正常的 Levenshtein 算法并稍作修改。

第一: 不是用 0,1,2,3,4,5,... 填充矩阵的第一行,而是用零填充它。(绿色矩形)

第二: 然后你运行算法。

第三: 不是返回最后一行的最后一个单元格,而是搜索最后一行中的最小值并返回它。(红色矩形)

示例: needle: "aba", haystack: "c abba c" --> result = 1 (转换 abba -> aba)

在此处输入图像描述

我测试了它并且它有效。

这比您在问题中逐个字符地通过字符串的建议要快得多。您只需创建一次矩阵。

于 2016-06-14T06:29:43.597 回答
4

Wagner-Fischer 算法“免费”为您提供所有前缀的答案。

http://en.wikipedia.org/wiki/Wagner%E2%80%93Fischer_algorithm

sWagner-Fischer 矩阵的最后一行包含到的每个前缀的编辑距离t

因此,作为您的问题的第一次破解,对于每个i,运行 Wagner-Fischer 并选择最后一行中的最小元素。

我很想知道是否有其他人知道(或可以找到)更好的方法。

于 2011-11-15T17:05:35.097 回答