给定2个字符串s
和t
,我需要找到每个子字符串与t
的编辑距离(Levenshtein距离)。实际上,我需要知道对于s
中的每个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
等等。
当然,我可以使用暴力算法来解决这个任务。但有更快的算法吗?
感谢您的帮助。
{2,1,**0,2**,2}
是错误的,因为相邻数字之间最多只能相差1:如果存在一个子串s[i..j]
与t
的编辑距离为k
,那么子串s[(i+1)..j]
可以通过在字符串开头进行第一次编辑操作插入s[i]
来匹配t
,其代价最多为k+1
。在你的例子中,对于第4个位置,distance("ab", "b") = 1
(1次插入),对于第5个位置,distance("ab", "cb") = 1
(1次替换)。 - j_random_hackers
的每个位置开始的最小编辑距离,还是其他更多的东西? - kcsquared