0
点赞
收藏
分享

微信扫一扫

力扣第72题 编辑距离 (增 删 改) C++ 动态规划 附Java代码

题目

72. 编辑距离

中等

相关标签

字符串   动态规划

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

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

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

示例 1:

输入:word1 = "horse", word2 = "ros"
输出:3
解释:
horse -> rorse (将 'h' 替换为 'r')
rorse -> rose (删除 'r')
rose -> ros (删除 'e')

示例 2:

输入:word1 = "intention", word2 = "execution"
输出:5
解释:
intention -> inention (删除 't')
inention -> enention (将 'i' 替换为 'e')
enention -> exention (将 'n' 替换为 'x')
exention -> exection (将 'n' 替换为 'c')
exection -> execution (插入 'u')

提示:

  • 0 <= word1.length, word2.length <= 500
  • word1 和 word2 由小写英文字母组成

思路和解题方法

复杂度

        时间复杂度:

                O(n*n)

        空间复杂度

                O(n*n)

c++ 代码

class Solution {
public:
    int minDistance(string word1, string word2) {
        int w1 = word1.size(), w2 = word2.size();
        // 定义一个二维动态数组 dp,其中 dp[i][j] 表示将 word1 的前 i 个字符转换为 word2 的前 j 个字符所需要的最少操作次数。
        vector<vector<int>> dp(w1+1, vector<int>(w2+1, 0));
        // 初始化第一行和第一列,即将一个空字符串转换成另一个字符串所需的最少操作次数。
        for(int i = 0; i <= w1; i++) dp[i][0] = i;
        for(int j = 0; j <= w2; j++) dp[0][j] = j;
        // 从第二行和第二列开始,按照状态转移方程进行计算。
        for(int i = 1; i <= w1; i++) {
            for(int j = 1; j <= w2; j++) {
                // 如果 word1 的第 i 个字符与 word2 的第 j 个字符相等,则不需要进行任何操作。
                if(word1[i-1] == word2[j-1])
                    dp[i][j] = dp[i-1][j-1];
                // 如果 word1 的第 i 个字符与 word2 的第 j 个字符不相等,则需要进行以下三种操作中的一种来进行转换操作:
                // 1. 在 word1 中插入一个字符;
                // 2. 在 word2 中插入一个字符;
                // 3. 替换 word1 中的第 i 个字符或者 word2 中的第 j 个字符。
                else
                    dp[i][j] = min({dp[i-1][j-1], dp[i-1][j], dp[i][j-1]}) + 1;
            }
        }
        // 返回将 word1 转换成 word2 的最少操作次数。
        return dp[w1][w2];
    }
};

Java代码

class Solution {
    public int minDistance(String word1, String word2) {
        // 获取两个字符串的长度
        int m = word1.length();
        int n = word2.length();
        // 创建一个二维数组来保存编辑距离
        int[][] dp = new int[m + 1][n + 1];
        
        // 初始化dp数组的第一行和第一列
        for (int i = 1; i <= m; i++) {
            dp[i][0] = i;
        }
        for (int j = 1; j <= n; j++) {
            dp[0][j] = j;
        }
        
        // 逐行逐列计算编辑距离
        for (int i = 1; i <= m; i++) {
            for (int j = 1; j <= n; j++) {
                // 判断当前字符是否相同
                if (word1.charAt(i - 1) == word2.charAt(j - 1)) {
                    // 如果相同,则不需要进行任何编辑操作
                    dp[i][j] = dp[i - 1][j - 1];
                } else {
                    // 如果不同,则需要进行插入、删除或替换等操作,选取其中编辑距离最小的一种
                    dp[i][j] = Math.min(Math.min(dp[i - 1][j - 1], dp[i][j - 1]), dp[i - 1][j]) + 1;
                }
            }
        }
        // 返回编辑距离数组的最后一个元素,即两个字符串的完全匹配所需的最小编辑距离
        return dp[m][n];
    }
}

觉得有用的话可以点点赞,支持一下。

如果愿意的话关注一下。会对你有更多的帮助。

每天都会不定时更新哦  >人<  。

举报

相关推荐

0 条评论