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 characterc) Replace a character
As indicated in the question. There are three ways to adjust two strings.
We can adjust the words either bottom up or top down.
1: Bottom Up: dp[i][j] = min(min(dp[i-1][j], dp[i][j-1])), dp[i-1][j-1]) + 1;
dp[i-1][j-1] is to replace ith character to jth character. dp[i-1][j] is to delete ith character, dp[i][j-1] is to insert jth character.
#include <vector> #include <string> #include <iostream> using namespace std; int minDistance(string word1, string word2) { int m = word1.size(); int n = word2.size(); vector< vector<int> > dis(m + 1, vector<int>(n + 1, 0)); for(int i = 0; i <= m; ++i) { dis[i][0] = i; } for(int i = 0; i <= n; ++i) { dis[0][i] = i; } for(int i = 1; i <= m; ++i) { for(int j = 1; j <= n; ++j) { if(word1[i-1] == word2[j-1]) { dis[i][j] = dis[i-1][j-1]; } else { // in this case word[i-1] != word[j-1]; // in this case, we have three choices. 1: delete, 2: insert, 3: replace. // dis[i-1][j-1] : replace // dis[i-1][j] : delete // dis[i][j-1] : insert dis[i][j] = min(min(dis[i-1][j], dis[i][j-1]), dis[i-1][j-1]) + 1; } } } return dis[m][n]; } int main(void) { string word1 = "ab"; string word2 = "abcd"; int distance = minDistance(word1, word2); cout << distance << endl; }
I honestly dont think I understand this question every well.... even though there is no problem with coding it out. It is better to practise multiple solutions!