Leetcode 72. 编辑距离

动态规划
Xx和Yy的编辑距离,有以下可能情况
1.X->Yy【x删除】:1+X->Yy
2.Xx..y->Yy【x后面添字符最后一个是y】==1+Xx->Y【可看出Yy->Xx时y删除的情况】
3.Xy->Yy【y替换x】:当x=y时,X->Y x!=y时1+X->Y

class Solution {
public:
    int dp[1005][1005];
    int minDistance(string word1, string word2) {
        int l1 = word1.size(), l2 = word2.size();
        for (int i = 0; i <= l2; ++i) dp[0][i] = i;
        for (int i = 0; i <= l1; ++i) dp[i][0] = i;
        for (int i = 1; i <= l1; ++i)
            for (int j = 1; j <= l2; ++j) {
                if (word1[i - 1] == word2[j - 1]) dp[i][j] = min(1 + min(dp[i - 1][j], dp[i][j - 1]), dp[i - 1][j - 1]);
                else  dp[i][j] = min(1 + min(dp[i - 1][j], dp[i][j - 1]), 1 + dp[i - 1][j - 1]);
            }
        return dp[l1][l2];
    }
};

进行路径压缩

class Solution {
public:
    int minDistance(string word1, string word2) {
        int l1 = word1.size(), l2 = word2.size(), pre, t;
        vector<int> dp;
        for (int i = 0; i <= l2; ++i) dp.push_back(i);
        for (int i = 1; i <= l1; ++i) {
            dp[0] = i, pre = i - 1;
            for (int j = 1; j <= l2; ++j) {
                t = dp[j];
                if (word1[i - 1] == word2[j - 1]) dp[j] = min(1 + min(t, dp[j - 1]), pre);
                else  dp[j] = min(1 + min(t, dp[j - 1]), pre + 1);
                pre = t;
            }
        }
        return dp[l2];
    }
};

猜你喜欢

转载自blog.csdn.net/bendaai/article/details/80298982