Edit Distance of the Two Words
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
I remembered there is standard algorithm to solve this problem, discussed in courses like Natural Language Processing (see www.coursera.com)
Dynamic Programming will be used to solve this problem.
Basic Idea:
If we know the distance between word2[i-1] & word1[j-1], between word2[i] & word1[j-1], and between word2[i-1] & word1[j], then the distance between word2[i] & word1[j] will be
if(word2[i] == word1[j])
dist[i][j] = min(dist[i-1][j-1], min(dist[i-1][j], dist[i][j-1])+1)
else
dist[i][j] = min(dist[i-1][j-1], min(dist[i-1][j], dist[i][j-1])) + 1
Un-optimized code:
class Solution {
public:
int minDistance(string word1, string word2) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
if(word2.length() == 0)
return word1.length();
if(word1.length() == 0)
return word2.length();
int word1Length = word1.length(), word2Length = word2.length();
int ** matrix = new int *[word2Length];
for(int i=0; i<word2Length; i++){
matrix[i] = new int[word1Length];
}
if(word1[0] == word2[0])
matrix[0][0] = 0;
else
matrix[0][0] = 1;
for(int j=1; j<word1Length; j++){
if(word1[j] == word2[0] && j<matrix[0][j-1] + 1)
matrix[0][j] = j;
else
matrix[0][j] = matrix[0][j-1]+1;
}
for(int i=1; i<word2Length; i++){
if(word2[i] == word1[0] && i<matrix[i-1][0] + 1)
matrix[i][0] = i;
else
matrix[i][0] = matrix[i-1][0] + 1;
for(int j=1; j<word1Length; j++){
int temp = min(min(matrix[i-1][j], matrix[i][j-1]), matrix[i-1][j-1]);
matrix[i][j] = temp + 1;
if(word1[j] == word2[i] && matrix[i-1][j-1] < temp + 1)
matrix[i][j] = matrix[i-1][j-1];
}
}
int ret = matrix[word2Length-1][word1Length-1];
for(int i=0; i<word2Length; i++)
delete[] matrix[i];
delete[] matrix;
return ret;
}
};