LeetCode/编辑距离

给你两个单词 word1 和 word2, 请返回将 word1 转换成 word2 所使用的最少操作数  。

你可以对一个单词进行如下三种操作:

插入一个字符
删除一个字符
替换一个字符

对于最优问题计算,考虑用动态规划,这里dp[i][j]设为
为word1前i个字符和word2前j个字符的最少操作数

随着往后遍历,需要考虑的字符串长度增加,分别需要考虑由增添、删除、修改三种方式转移过来的状态,取最小值
增,dp[i][j] = dp[i][j - 1] + 1
删,dp[i][j] = dp[i - 1][j] + 1
改,dp[i][j] = dp[i - 1][j - 1] + 1

class Solution {
public:
    int minDistance(string word1, string word2) {
        //最优问题使用动态规划,设dp[i][j]为word1前i个字符和word2前j个字符的最少操作数
        //接着考虑状态转移方程和边界条件
        //显然dp[0][j]=j,dp[i][0]=i
        //dp[i][j]
        int n = word1.size();
        int m = word2.size();
        // 有一个字符串为空串
        if (n * m == 0) return n + m;
        // DP 数组
        vector<vector<int>> D(n + 1, vector<int>(m + 1));
        // 边界状态初始化
        for (int i = 0; i < n + 1; i++) 
            D[i][0] = i;
        for (int j = 0; j < m + 1; j++) 
            D[0][j] = j;
        // 计算所有 DP 值
        for (int i = 1; i < n + 1; i++) {
            for (int j = 1; j < m + 1; j++) {
                int left = D[i - 1][j] + 1;
                int down = D[i][j - 1] + 1;//
                int left_down = D[i - 1][j - 1];
                if (word1[i - 1] != word2[j - 1]) left_down += 1;//不相等需要替换
                D[i][j] = min(left, min(down, left_down));

            }
        }
        return D[n][m];
    }
};
posted @ 2022-05-26 19:52  失控D大白兔  阅读(8)  评论(0编辑  收藏  举报