leetcode 72. edit distance

Description:

Given two words word1 and word2, find the minimum number of steps required to convert word1 to word2. (each operation is counted as 1 step.)

You have the following 3 operations permitted on a word:

a) Insert a character
b) Delete a character
c) Replace a character

Solution:

最小编辑距离问题,也可以称为字符串相似度(编程之美3.3)。可用动态规划求解:用dp[i][j]表示字符串X[0..i-1]和Y[0..j-1]的最小编辑距离,那么可以知道:

  • 如果X[i-1]=Y[j-1],那么dp[i][j] = dp[i-1][j-1];
  • 否则dp[i][j]等于dp[i-1][j]、dp[i][j-1]和dp[i-1][j-1]这三个中最小的加上1。
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
class  
{
public:
int minDistance(string word1, string word2)
{
int len1 = word1.size();
int len2 = word2.size();

vector<vector<int> > dp(len1 + 1, vector<int>(len2 + 2, 0));

for (int i = 0; i <= len1; ++i)
dp[i][0] = i;

for (int j = 0; j <= len2; ++j)
dp[0][j] = j;

for (int i = 1; i <= len1; ++i)
{
for (int j = 1; j <= len2; ++j)
{
if (word1[i-1] == word2[j-1])
dp[i][j] = dp[i-1][j-1];
else
dp[i][j] = min(min(dp[i-1][j], dp[i][j-1]), dp[i-1][j-1]) + 1;
}
}

return dp[len1][len2];
}
};