【Leetcode】Edit Distance #72

来源:互联网 发布:godaddy新加坡注册域名 编辑:程序博客网 时间:2024/06/03 19:24

Given two words word1 and word2, find the minimum number of steps required to convertword1 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

方法一:
一开始自己用的动态规划,代码可以通过但是速度很慢。C++跑了240ms,而大多数C++仅需30ms。
class Solution {public:  int minDistance(string word1, string word2) {    return minDistanceHelper(word1, 0, word2, 0);  }private:  unordered_map<int, unordered_map<int, int>> record;  int minDistanceHelper(string word1, int cur_1, string word2, int cur_2){    int minValue;    if (record.find(cur_1) != record.end() && record[cur_1].find(cur_2) != record[cur_1].end()) {      minValue = record[cur_1][cur_2];    }    else if ( cur_1 == word1.size() && cur_2 == word2.size()) minValue = 0;    else if (cur_1 == word1.size() && cur_2 != word2.size()) minValue = word2.size() - cur_2;    else if (cur_1 != word1.size() && cur_2 == word2.size()) minValue = word1.size() - cur_1;    else if (word1[cur_1] == word2[cur_2]) minValue = minDistanceHelper(word1, cur_1 + 1, word2, cur_2 + 1);    else {      int add_word1 = minDistanceHelper(word1, cur_1, word2, cur_2 + 1);      int replace_word1 = minDistanceHelper(word1, cur_1 + 1, word2, cur_2 + 1);      minValue = min(add_word1, replace_word1);      int delete_word1 = minDistanceHelper(word1, cur_1 + 1, word2, cur_2);      minValue = min(minValue, delete_word1);      minValue += 1;    }    record[cur_1][cur_2] = minValue;    return minValue;  }};

将递归改为循坏可以节省大量时间:
代码摘自:https://leetcode.com/discuss/43398/20ms-detailed-explained-c-solutions-o-n-space
解释的很好,值得复习时再看。
注意,循环时,i,j表示的是0..i-1和0..j-1的情况。若不如此,而用i,j表示0...i和0...j的情况,则当size为0时dp[m][n]等需要extra work。故在此不用
class Solution { public:    int minDistance(string word1, string word2) {         int m = word1.length(), n = word2.length();        vector<vector<int> > dp(m + 1, vector<int> (n + 1, 0));        for (int i = 1; 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 - 1] == word2[j - 1])                     dp[i][j] = dp[i - 1][j - 1];                else dp[i][j] = min(dp[i - 1][j - 1] + 1, min(dp[i][j - 1] + 1, dp[i - 1][j] + 1));            }        }        return dp[m][n];    }};

0 0
原创粉丝点击