首页 > 其他 > 详细

72. Edit Distance (String; DP)

时间:2015-10-29 17:55:53      阅读:291      评论:0      收藏:0      [点我收藏+]

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()];
    }
};

 

72. Edit Distance (String; DP)

原文:http://www.cnblogs.com/qionglouyuyu/p/4920976.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!