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:
- Insert a character
- Delete a character
- Replace a character
Example
Given word1 = "mart"
and word2 = "karma"
, return 3
.
如果word1[i] ==word2[j], 那么dp[i][j] = dp[i-1][j-1]
若果不相等,则有三种情况:
将word1[i] 改成word2[j] ---> dp[i][j] = dp[i-1][j-1] + 1
在word1[i] 后面添加 word2[j] ---> dp[i][j] = dp[i][j-1] + 1
将word1[i] 删掉, ---> dp[i][j] = dp[i-1][j] + 1
c++实现:
class Solution {
public:
/**
* @param word1 & word2: Two string.
* @return: The minimum number of steps.
*/
int minDistance(string word1, string word2) {
// write your code here
if (word2.size() == 0)
return word1.size();
if (word1.size() == 0)
return word2.size();
word1="#"+word1;
word2="#"+word2;
const int m = (int)word1.size();
const int n = (int)word2.size();
int dp[m][n];
memset(dp, 0, sizeof(dp));
for (int i = 0; i< m; i++) {
dp[i][0] = i;
}
for (int j = 1; j < n; j++) {
dp[0][j] = j;
}
for (int i = 1; i< m; i++) {
for (int j = 1; j < n; j++) {
if (word1[i] == word2[j]) {
dp[i][j] = dp[i-1][j-1];
} else {
dp[i][j] = min(dp[i-1][j]+1, dp[i][j-1]+1);
dp[i][j] = min(dp[i][j], dp[i-1][j-1]+1);
}
}
}
return dp[m-1][n-1];
}
};