leetcode Edit Distanc (DP)

来源:互联网 发布:学淘宝推广 编辑:程序博客网 时间:2024/05/29 08:04
Edit Distance Total Accepted: 5097 Total Submissions: 20793 My Submissions
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


第一个自己做出来的DP题啊!

注意到增和删其实是一样的效果,增加A里面的一个字符,就等于把B里面多的那个字符删掉。所以就是比较删A还是删B,就是d[i][j] = min(d[i-1][j], d[i][j-1]

然后再加上这次的增或删操作就是+1.


// 第一次做把这种情况给漏了

然后还有以一种就是当前位置A[i]和B[i]的字符做替换,这种就是说看看A[i-1],  B[i-1]是否相等了,相等就是做替换最小。 就是d[i][j] = min(上面两个, d[i-1][j-1])

然后在加上这次的替换操作就是+1.



因此 d[i][j] = min(d[i-1][j], d[i][j-1], d[i-1][j-1]) + 1;


因此状态转移方程为:

                if (word1[i] == word2[j]) {
                    d[i][j] = d[i-1][j-1];
                } else {
                    d[i][j] = min(d[i-1][j], d[i][j-1], d[i-1][j-1]) + 1;
                }

注意初始化。


所以这道题没写出状态方程之前,就可以大概感觉到,实际上是2D/0D的问题,因为比较明显只依赖于O(n^0)的子问题来推导当前子问题,一共有O(n^2)个子问题。然后就可以从d[0][0]开始手算,来验证想法。确实是依赖于O(1)的子问题的。



class Solution {
public:
 int minDistance(string word1, string word2) {
    if (word1.size() == 0 && word2.size() == 0) return 0;
    if (word1.size() == 0) return word2.size();
    if (word2.size() == 0) return word1.size();


    vector<vector<int> > d;
    d.resize(word1.size());
    for (int i = 0; i < d.size(); ++i) {
        d[i].resize(word2.size(), 0);
    }


    if (word1[0] == word2[0])
        d[0][0] = 0;
    else
        d[0][0] = 1;


    for (int i = 1; i < word1.size(); ++i) {
        if (word1[i] == word2[0])
            d[i][0] = i;
        else
            d[i][0] = d[i-1][0] + 1;
    }
    for (int i = 1; i < word2.size(); ++i) {
        if (word2[i] == word1[0])
            d[0][i] = i;
        else
            d[0][i] = d[0][i-1] + 1;
    }


    for (int i = 1; i < word1.size(); ++i) {
        for (int j = 1; j < word2.size(); ++j) {
            if (word1[i] == word2[j]) {
                d[i][j] = d[i-1][j-1];
            } else {
                d[i][j] = min(d[i-1][j], d[i][j-1]);
                d[i][j] = min(d[i][j], d[i-1][j-1]);
                d[i][j] += 1;
            }
        }
    }
    return d[word1.size()-1][word2.size()-1];
}
};
1 0
原创粉丝点击