day56【动态规划-编辑距离】583.两个字符串的删除操作 72.编辑距离

文章目录

  • 583.两个字符串的删除操作
  • 72.编辑距离

583.两个字符串的删除操作

  • 力扣题目链接

  • 代码随想录讲解链接

  • 题意:给定两个单词 word1 和 word2 ,返回使得 word1 和 word2 相同所需的最小步数。

    每步 可以删除任意一个字符串中的一个字符。

      示例 1:
      输入: word1 = "sea", word2 = "eat"
      输出: 2
      解释: 第一步将 "sea" 变为 "ea" ,第二步将 "eat "变为 "ea"
      
      示例  2:
      输入:word1 = "leetcode", word2 = "etco"
      输出:4
    
  • 思路,见代码注释

class Solution {
    public int minDistance(String word1, String word2) {
        char[] char1 = word1.toCharArray();
        char[] char2 = word2.toCharArray();

        //代表使以i-1结尾的word1和j-1结尾的word2相同所需要的最小步数
        int[][] dp = new int[char1.length+1][char2.length+1];

        //word2为空字符时,以i-1为结尾的word1要删除i-1个元素才能和空字符相同
        for(int i = 0; i < char1.length+1; i++) {
            dp[i][0] = i;
        }
        //与上同理
        for(int j = 0; j < char2.length+1; j++) {
            dp[0][j] = j;
        }
 
        for(int i = 1; i <= char1.length; i++) {
            for(int j = 1; j <= char2.length; j++) {
                if(char1[i-1] == char2[j-1]) { //此时不需要删除元素
                    dp[i][j] = dp[i-1][j-1];
                } else { //此时有三种情况
                //删word1,最少操作为dp[i-1][j] + 1;
                //删word2,最少操作为dp[i][j-1] + 1;
                //同时删word1和2,最少操作为dp[i-1][i-1]+2;
                    dp[i][j] = Math.min(Math.min(dp[i][j-1]+1, dp[i-1][j]+1), dp[i-1][j-1]+2);
                }
            }
        } 
        return dp[char1.length][char2.length];
    }
}

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')
    
  • 思路,见代码

class Solution {
    public int minDistance(String word1, String word2) {
        char[] char1 = word1.toCharArray();
        char[] char2 = word2.toCharArray();

        //以i-1为结尾的word1转换成以j-1为结尾的word2所使用的最少操作数为dp[i][j]
        int[][] dp = new int[char1.length+1][char2.length+1];

        //初始化,dp[0][j]和dp[i][0];
        for(int j = 0; j <= char2.length; j++) {
            dp[0][j] = j;
        }
        for(int i = 0; i <= char1.length; i++) {
            dp[i][0] = i;
        }
 
        for(int i = 1; i <= char1.length; i++) {
            for(int j = 1; j <= char2.length; j++) {
                if(char1[i-1] == char2[j-1]) {
                    //此时不操作
                    dp[i][j] = dp[i-1][j-1];
                } else {
                    //此时有增、删、改3种操作
                    //word1中删除元素,dp[i-1][j]+1
                    //word2中删除元素,dp[i][j-1]+1
                    //为什么都是删除元素?在word2中删除元素,相当于在word1中增加元素;在word1中删除元素,相当于在word2中增加元素。
                    //替换元素,只需要一次替换,就可以让word1[i-1]=word2[j-1],即dp[i-1][j-1]+1
                    dp[i][j] = Math.min(Math.min(dp[i-1][j]+1, dp[i][j-1]+1), dp[i-1][j-1]+1);
                }
            }
        } 
        return dp[char1.length][char2.length];
    }
}

你可能感兴趣的:(动态规划,算法)