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]; } };
|
近期评论