标签:编辑距离 动态规划
简单地说,就是仅通过插入(insert)、删除(delete)和替换(substitute)个操作将一个字符串s1变换到另一个字符串s2的最少步骤数。熟悉算法的同学很容易知道这是个动态规划问题。
其实一个替换操作可以相当于一个delete+一个insert,所以我们将权值定义如下:
I (insert):1
D (delete):1
S (substitute):1
示例:
intention->execution
Minimal edit distance:
delete i ; n->e ; t->x ; insert c ; n->u 求和得cost=5
如果能想到是动态规划问题就不难解决了。
class Solution {
public:
int minDistance(string word1, string word2) {
const size_t n = word1.size();
const size_t m = word2.size();
int f[n + 1][m + 1];
for(size_t i = 0; i <= n; i++)
f[i][0] = i;
for(size_t j = 0; j <= m; j++)
f[0][j] = j;
for(size_t i = 1; i <= n; i++)
{
for(size_t j = 1; j <= m; j++)
{
if(word1[i - 1] == word2[j - 1])
f[i][j] = f[i - 1][j - 1];
else
{
int mn = min(f[i - 1][j], f[i][j - 1]);
f[i][j] = min(f[i - 1][j - 1], mn) + 1;
}
}
}
return f[n][m];
}
};可以通过滚动数组的形式,将空间复杂度降至O(min(m, n))
参考网址:编辑距离-自然语言处理 编辑距离-张大神
(每日算法)Leetcode--Edit Distance(编辑距离)
标签:编辑距离 动态规划
原文地址:http://blog.csdn.net/yapian8/article/details/41087699