LeetCode 72

https://leetcode.cn/problems/edit-distance/description/

难度:中等

这是线性 DP 的经典题目,类似 LeetCode 1143 最长公共子序列。

状态转移方程为:

//word1[i] == word2[j]
f[i + 1][j + 1] = f[i][j];
//word1[i] != word2[j]
f[i + 1][j + 1] = min({f[i + 1][j], f[i][j + 1], f[i][j]}) + 1;

在不相等时,三种情况分别对应插入,删除,替换的情况。

此外,还要注意数组的初始化操作。

f[i + 1][0] = i + 1;
f[0][j + 1] = j + 1;

时间复杂度:O(nm),其中 n 为 word1 的长度,m 为 word2 的长度。

空间复杂度:O(nm)。

class Solution {
public:
    int minDistance(string word1, string word2) {
        int m = word1.size(), n = word2.size();
        vector f(m + 1, vector<int>(n + 1, 0));
        for (int j = 0; j < n; j++) {
            f[0][j + 1] = j + 1;
        }
        for (int i = 0; i < m; i++) {
            f[i + 1][0] = i + 1;
            for (int j = 0; j < n; j++) {
                if (word1[i] == word2[j]) {
                    f[i + 1][j + 1] = f[i][j];
                } else {
                    f[i + 1][j + 1] = min({f[i][j + 1], f[i + 1][j], f[i][j]}) + 1;
                }
            }
        }
        return f[m][n];
    }
};