lintcode 编辑距离

描述

给出两个单词word1和word2,计算出将word1 转换为word2的最少操作次数。

你总共三种操作方法:

插入一个字符
删除一个字符
替换一个字符

样例

1

输入:
“horse”
“ros”
输出: 3
解释:
horse -> rorse (替换 ‘h’ 为 ‘r’)
rorse -> rose (删除 ‘r’)
rose -> ros (删除 ‘e’)

2

输入:
“intention”
“execution”
输出: 5
解释:
intention -> inention (删除 ‘t’)
inention -> enention (替换 ‘i’ 为 ‘e’)
enention -> exention (替换 ‘n’ 为 ‘x’)
exention -> exection (替换 ‘n’ 为 ‘c’)
exection -> execution (插入 ‘u’)

思路

动态规划
设dp[i][j]表示 word1前i个字符转换为word2前j个字符所需要的操作数
初始状态 dp[0][j] (0<=j<=word2.length()) = j
dp[i][0] (0<=i<=word1.length()) = i

关系式 对于任意状态下的dp[i][j]可以由三种方式得出

1. 如果word1[i] == word2[j],此时从word1转换为word2 和 dp[i-1][j-1]相同,如: hors转换为ros 与hor和ro相同,s不需要管
2. 如果不相等,此时分为三种方式
  2.1 把word1[i]替换为word2[j] 1+dp[i-1][j-1]   如:horse转换为ros 多一步 e转换为s
  2.2 删掉word1[i] 1+dp[i-1][j] 如:horse转换为ros 比较 hors 转换为 ros 只需要插入一个e
  2.3 删除word2[j] 1+dp[i-1][j] 同2.2

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
class Solution {
public:
/**
* @param word1: A string
* @param word2: A string
* @return: The minimum number of steps.
*/


int minDistance(string &word1, string &word2) {
// write your code here
if (word1.length() == 0 || word2.length() == 0)
return max(word1.length(), word2.length());


vector<vector<int>> dp(word1.length()+1, vector<int>(word2.length()+1, 0));
// dp[i][j] word1:i word2:j

for (int j = 0; j <= word2.length(); j++)
dp[0][j] = j;

for (int i = 0; i <= word1.length(); i++)
dp[i][0] = i;

for (int i = 1; i <= word1.length();i++) {
for (int j = 1; j <= word2.length(); j++){

if (word1[i-1] == word2[j-1])
dp[i][j] = min(1+dp[i][j-1],dp[i-1][j-1]);
else
dp[i][j] = min(1+dp[i][j-1], min(1+dp[i-1][j], 1+dp[i-1][j-1]));
}
}


return dp[word1.length()][word2.length()];
}
};
-------------end of file thanks for reading-------------

你可能感兴趣的:(lintcode 编辑距离)