72. Edit Distance

LeetCode 力扣

1. Description

Given two strings word1 and word2, return the minimum number of operations required to convert word1 to word2.
You have the following three operations permitted on a word:

  • Insert a character
  • Delete a character
  • Replace a character

2. Example

Example 1

Input: word1 = “horse”, word2 = “ros”
Output: 3
Explanation:
horse -> rorse (replace ‘h’ with ‘r’)
rorse -> rose (remove ‘r’)
rose -> ros (remove ‘e’)

Example 2

Input: word1 = “intention”, word2 = “execution”
Output: 5
Explanation:
intention -> inention (remove ’t')
inention -> enention (replace ‘i’ with ‘e’)
enention -> exention (replace ‘n’ with ‘x’)
exention -> exection (replace ‘n’ with ‘c’)
exection -> execution (insert ‘u’)

3. Constraints

  • 0 <= word1.length, word2.length <= 500
  • word1 and word2 consist of lowercase English letters.

4. Solutions

Dynamic Programming

m = word1.size(), n = word2.size()
Time complexity: O(mn)
Space complexity: O(min(m, n))

 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
31
32
class Solution {
public:
    int minDistance(const string &word1, const string &word2) {
        bool word1_longer = word1.size() > word2.size();
        const string w1 = word1_longer ? word1 : word2;
        const string w2 = word1_longer ? word2 : word1;
        const int m = w1.size(), n = w2.size();

        vector<int> count(n + 1, 0);
        for (int i = 0; i <= n; ++i) {
            count[i] = i;
        }

        for (int i = 1; i <= m; ++i) {
            int diagonal = count[0];
            count[0] = i;
            for (int j = 1; j <= n; ++j) {
                int above = count[j];

                if (w1[i - 1] == w2[j - 1]) {
                    count[j] = diagonal;
                } else {
                    count[j] = 1 + min(diagonal, min(count[j], count[j - 1]));
                }

                diagonal = above;
            }
        }

        return count.back();
    }
};
comments powered by Disqus