[LeetCode] Edit Distance

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

Find minimum number of steps, then it must be a Dynamic Programming problem. Only thing we need is a recursive definition of this problem.

We can define data(i, j) as the Edit Distance of the first i characters of word1 and first j characters of word 2, so when word1[i] is equal to word2[j], data(i, j) will be the same as data(i – 1, j – 1), because we need nothing to change word1[i] to word2[j]; when word1[i] is not equal to word2[j], then data(i, j) will be the minimum of (data(i, j – 1), data(i – 1, j), data(i – 1, j – 1)) plus 1. Of course, when i is equal to 0, data(0, j)’s value is j, because i = 0, means this substring has 0 character, so it will take j steps to change this empty substring to the j-length substring, and the same reason to data(i, 0).

    int minDistance(string word1, string word2) {
        if(word1.empty() && word2.empty()) return 0;
        if(word1.empty()) return word2.length();
        if(word2.empty()) return word1.length();
        if(word1 == word2) return 0;
        int len1 = word1.length() + 1;
        int len2 = word2.length() + 1;
        if(len1 == 2 && len2 == 2) return 1;
        int **data = new int*[len1];
        for(int i=0; i<len1; i++){
            data[i] = new int[len2];
        }
        for(int i=0; i<len1; i++){
            data[i][0] =  i;
        }
        for(int i=0; i<len2; i++){
            data[0][i] =  i;
        }
        for(int i=1; i<len1; i++){
            for(int j=1; j<len2; j++){
                if(word1[i-1] == word2[j-1]){
                    data[i][j] = data[i-1][j-1];
                }else{
                    data[i][j] = min(min(data[i-1][j], data[i][j-1]), data[i-1][j-1]) + 1;
                }
            }
        }
        int result = data[len1 - 1][len2 - 1];
        return result;
    }

 

🙂

This entry was posted in Algorithm, Dynamic Programming, LeetCode and tagged , , . Bookmark the permalink. Post a comment or leave a trackback: Trackback URL.

Post a Comment

Your email is never published nor shared. Required fields are marked *

You may use these HTML tags and attributes <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*
*