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
输出:
3
上述解的时间复杂度是指数的。在最坏的情况下,我们可能最终做O(3 m)操作。最坏的情况发生在两个字符串的字符都不匹配时。下面是最坏情况下的递归调用图。
我们可以看到,许多子问题被一次又一次解决,例如eD(2,2)被称为三次。由于相同的suproblems被再次调用,这个问题具有重叠子属性。因此,编辑距离问题具有动态规划问题的属性(见这个和这个)。像其他典型的动态编程(DP)问题一样,通过构造存储子参数结果的临时数组,可以避免重新计算相同的子问题。
Java
Java
spaces”>
dp[i
-
1
][j
-
1
])
# ReplaceRun on IDE
相关文章推荐
- 利用最小编辑距离算法实现文本diff
- Levenshtein distance最小编辑距离算法实现
- Levenshtein distance最小编辑距离算法实现
- LD 算法实现(编辑距离算法)
- LD 算法实现(编辑距离算法)
- 编辑距离算法的java实现
- 用C#实现字符串相似度算法(编辑距离算法 Levenshtein Distance)
- java实现编辑距离算法,计算字符串相似度
- java实现的最小编辑距离
- 最短编辑距离算法实现
- Python实现计算最小编辑距离
- [算法集锦]编辑距离分析与实现
- 最小编辑距离python实现
- 【动态规划】字符串最小编辑距离Java实现
- 经典算法 | 字符串最小编辑距离分析与证明
- 字符串相关算法(编辑距离,最大公共字串)C#实现版
- Python实现计算最小编辑距离
- 平面上点对的最小距离算法-java实现
- 动态规划(最小字符串编辑距离实现)
- 编辑距离算法实现