72. Edit Distance (String; DP)

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:带回溯的递归。但结果Time Limit Exceeded.

class Solution {
public:
    int minDistance(string word1, string word2) {
        // Start typing your C/C++ solution below
        // DO NOT write int main() function
        if(word1.empty()) return word2.length();
        else if(word2.empty()) return word1.length();

        result = max(word1.length(),word2.length());
        while(word1[0] == word2[0]){
            if(word2.length()==1)
            {
                result = word1.length()-1;
                return result;
            }
            else if(word1.length()==1)
            {
                result = word2.length()-1;
                return result;
            }
            word1 =word1.substr(1,word1.length()-1);
            word2 = word2.substr(1,word2.length()-1);
        }
        replaceOpr(word1,word2,1); //replace一般所用的操作最少,所以写在最前面
        insertOpr(word1,word2,1);
        deleteOpr(word1,word2,1);
        return result;
    }
    void insertOpr(string word1, string word2, int oprNum)
    {
        if(word2.length()==1)
        {
            oprNum += word1.length();
            if(oprNum < result) result = oprNum;
            return;
        }

        word2 = word2.substr(1,word2.length()-1); //insert

        while(word1[0] == word2[0]){
            if(word2.length()==1)
            {
                oprNum += word1.length()-1;
                if(oprNum < result) result = oprNum;
                return;
            }
            else if(word1.length()==1)
            {
                oprNum += word2.length()-1;
                if(oprNum < result) result = oprNum;
                return;
            }
            word1 =word1.substr(1,word1.length()-1);
            word2 = word2.substr(1,word2.length()-1);
        }
        if(oprNum+1>result) return;
        replaceOpr(word1,word2,oprNum+1);
        insertOpr(word1,word2, oprNum+1);
        deleteOpr(word1,word2,oprNum+1);
    }
    void deleteOpr(string word1, string word2, int oprNum)
    {
        if(word1.length() == 1)
        {
            oprNum += word2.length()-1;
            if(oprNum < result) result = oprNum;
            return;
        }

        word1 =word1.substr(1,word1.length()-1); //delete

        while(word1[0] == word2[0]){
            if(word2.length()==1)
            {
                oprNum += word1.length()-1;
                if(oprNum < result) result = oprNum;
                return;
            }
            else if(word1.length()==1)
            {
                oprNum += word2.length()-1;
                if(oprNum < result) result = oprNum;
                return;
            }
            word1 =word1.substr(1,word1.length()-1);
            word2 = word2.substr(1,word2.length()-1);
        }
        if(oprNum+1>result) return;
        replaceOpr(word1,word2,oprNum+1);
        insertOpr(word1,word2, oprNum+1);
        deleteOpr(word1,word2,oprNum+1);
    }
    void replaceOpr(string word1, string word2, int oprNum)
    {
        if(word2.length()==1)
        {
            oprNum += word1.length()-1;
            if(oprNum < result) result = oprNum;
            return;
        }
        else if(word1.length() == 1)
        {
            oprNum += word2.length()-1;
            if(oprNum < result) result = oprNum;
            return;
        }

        word1 =word1.substr(1,word1.length()-1);
        word2 = word2.substr(1,word2.length()-1); 

        while(word1[0] == word2[0]){
            if(word2.length()==1)
            {
                oprNum += word1.length()-1;
                if(oprNum < result) result = oprNum;
                return;
            }
            else if(word1.length()==1)
            {
                oprNum += word2.length()-1;
                if(oprNum < result) result = oprNum;
                return;
            }
            word1 =word1.substr(1,word1.length()-1);
            word2 = word2.substr(1,word2.length()-1);
        }
        if(oprNum+1>result) return;
        replaceOpr(word1,word2,oprNum+1);
        insertOpr(word1,word2, oprNum+1);
        deleteOpr(word1,word2, oprNum+1);
    }
private:
    int result;
};

思路II:动态规划。将所要求的min step作为状态,dp[i][j]表示word2的前j各字符通过word1的前i各字符转换最少需要多少步。可以看到有两个以上的string,通常状态要定义为二维数组,表示两个字符串前几个字符之间的关系。

class Solution {
public:
    int minDistance(string word1, string word2) {
        vector<vector<int> > f(word1.size()+1, vector<int>(word2.size()+1));

        f[0][0] = 0;
        for(int i = 1; i <= word2.size(); i++)
            f[0][i] = i;

        for(int i = 1; i <= word1.size(); i++)
            f[i][0] = i;

        for(int i = 1; i <= word1.size(); i++)
            for(int j = 1; j <= word2.size(); j++)
            {
                f[i][j] = INT_MAX;
                if (word1[i-1] == word2[j-1])
                    f[i][j] = f[i-1][j-1];

                f[i][j] = min(f[i][j], f[i-1][j-1] + 1); //replace
                f[i][j] = min(f[i][j], min(f[i-1][j], f[i][j-1]) + 1); //delete or insert
            }

        return f[word1.size()][word2.size()];
    }
};
时间: 2024-07-30 19:26:57

72. Edit Distance (String; DP)的相关文章

72. Edit Distance &amp;&amp; 161. One Edit Distance

72. 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 characterb) Delete a c

刷题72. Edit Distance

一.题目说明 题目72. Edit Distance,计算将word1转换为word2最少需要的操作.操作包含:插入一个字符,删除一个字符,替换一个字符.本题难度为Hard! 二.我的解答 这个题目一点思路也没,就直接看答案了.用的还是dp算法,dp[n1+1][n2+1]中的dp[i][j]表示将word1的前i位,变为word2的前j位需要的步骤.注意第1行是空,第1列也是空. 1.第一行中,dp[0][i]表示空字符""到word2[0,...,i]需要编辑几次 2.第一列中,d

LeetCode 72. Edit Distance Java

72.Edit Distance(编辑距离) 题目: 给定两个单词 word1 和 word2,计算出将 word1 转换成 word2 所使用的最少操作数 . 你可以对一个单词进行如下三种操作: 插入一个字符 删除一个字符 替换一个字符 思路: 多次选择试图得到最优解,那么考虑动态规划. 先假设word1有len1位,word2有len2位,建立数组step,step[i][j]就代表我们要将word1前 i 位转换为word2前 j 位的最少数量. 此时word1查找到第 i+1 位字母a,

Baozi Leetcode solution 72. Edit Distance

Problem Statement Given two words word1 and word2, find the minimum number of operations required to convert word1 to word2. You have the following 3 operations permitted on a word: Insert a character Delete a character Replace a character Example 1:

leetCode 72.Edit Distance (编辑距离) 解题思路和方法

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 char

第十八周 Leetcode 72. Edit Distance(HARD) O(N^2)DP

Leetcode72 看起来比较棘手的一道题(列DP方程还是要大胆猜想..) DP方程该怎么列呢? dp[i][j]表示字符串a[0....i-1]转化为b[0....j-1]的最少距离 转移方程分三种情况考虑 分别对应三中操作 因为只需要三个值就可以更新dp[i][j] 我们可以把空间复杂度降低到O(n) Replace word1[i - 1] by word2[j - 1] (dp[i][j] = dp[i - 1][j - 1] + 1 (for replacement)); Delet

LeetCode 72 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) Repla

[leetcode72]Edit Distance(dp)

题目链接:https://leetcode.com/problems/edit-distance/ 题意:求字符串的最短编辑距离,就是有三个操作,插入一个字符.删除一个字符.修改一个字符,最终让两个字符串相等. DP,定义两个字符串a和b,dp(i,j)为截至ai-1和bj-1时的最短编辑距离. 当ai-1=bi-1的时候,有dp(i,j)=min(dp(i,j),dp(i-1,j-1)),对应不做任何操作: 不相等的时候会有dp(i,j)=min(dp(i,j),dp(i-1,j-1)+1),

72. 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 characterb) Delete a characterc) Replace