当前位置:   article > 正文

代码随想录算法训练营第五十五天|LeetCode583.两个字符串的删除操作 、LeetCode72.编辑距离

代码随想录算法训练营第五十五天|LeetCode583.两个字符串的删除操作 、LeetCode72.编辑距离

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

题目链接:583. 两个字符串的删除操作 - 力扣(LeetCode)

【解题思路】

  • 1.确定dp数组含义

    • dp[i][j]:表示以下标i-1为结尾的word1,和以j-1为结尾的字符串word2,想要达到相等,所需要删除元素的最少次数

  • 2.确定递推公式

    • word1[i-1]与word2[j-1]相同

      • dp[i][j] = dp[i-1][j-1]

    • word1[i-1]与word2[j-1]不同

      • 情况一:删word1[i-1]

        • 最少操作次数为:dp[i-1][j]+1

      • 情况二:删word2[j-1]

        • 最少操作次数为:dp[i][j-1]+1

      • 情况三:同时删word1[i-1]和word2[j-1]

        • 最少操作次数为:dp[i-1][j-1]+2

  • 3.初始化dp数组

    • 从递推公式可以看出我们需要初始化dp[i][0],dp[0][j]

      • dp[i][0] = i

        • word2为空字符串,以i-1为结尾的字符串word1要要删除i个元素才能和word2相同

      • dp[0][j]=j

        • word1为空字符串,以j-1为结尾的字符串word2要要删除j个元素才能和word1相同

  • 4.确定遍历顺序

    • 由递推公式可以知道,遍历顺序一定是从上到下,从左到右

  • 5.举例推导dp数组

【解题步骤】

  • 1.定义一个dp数组,长度为两个字符串的长度+1

  • 3.遍历两个字符串

    • 将dp[i][0]初始化为i

    • 将dp[0][j]初始化为j

  • 4.遍历word1

    • 遍历word2

      • 如果两个字符串当前位置的元素相同

        • 递推公式1

      • 如果两个字符串当前位置的元素不同

        • 递推公式2

  • 5.return dp[word1.length()][word2.length()]

【代码部分】

  1. class Solution {
  2. public int minDistance(String word1, String word2) {
  3. //初始化、准备工作
  4. int[][] dp = new int[word1.length() + 1][word2.length() + 1];
  5. for (int i = 0; i < word1.length() + 1; i++) dp[i][0] = i;
  6. for (int j = 0; j < word2.length() + 1; j++) dp[0][j] = j;
  7. //遍历两个word
  8. for (int i = 1; i < word1.length() + 1; i++) {
  9. for (int j = 1; j < word2.length() + 1; j++) {
  10. if(word1.charAt(i-1) == word2.charAt(j-1)){
  11. dp[i][j] = dp[i-1][j-1];
  12. }else {
  13. dp[i][j] =Math.min(dp[i-1][j] + 1, dp[i][j-1] + 1);
  14. }
  15. }
  16. }
  17. return dp[word1.length()][word2.length()];
  18. }
  19. }

LeetCode 72 编辑距离

题目链接:72. 编辑距离 - 力扣(LeetCode)

【解题思路】

  • 1.确定dp数组含义

    • dp[i][j]:表示以下标i-1为结尾的word1,和以j-1为结尾的字符串word2,最近编辑距离为dp[i][j]

  • 2.确定递推公式

    • word1[i-1]与word2[j-1]相同

      • dp[i][j] = dp[i-1][j-1]

    • word1[i-1]与word2[j-1]不同

      • 删除操作

        • 其实word2添加一个元素,相当于word1删除一个元素,因此,添加和删除操作相同

        • 操作一:word1删除一个元素

          • 即:以下标i - 2为结尾的word1 与 j-1为结尾的word2的最近编辑距离 再加上一个操作

          • 最少操作次数为:dp[i-1][j]+1

        • 操作二:word2删除一个元素

          • 即:以下标i - 1为结尾的word1 与 j-2为结尾的word2的最近编辑距离 再加上一个操作

          • 最少操作次数为:dp[i][j-1]+1

      • 替换操作:

        • 操作三:word1替换word1[i-1],使其与word2[j-1]相同

          • dp[i-1][j-1]+1

            • 只需要执行替换这一个操作,因此只需要+1

  • 3.初始化dp数组

    • 从递推公式可以看出我们需要初始化dp[i][0],dp[0][j]

      • dp[i][0] = i

        • 以下标i-1为结尾的字符串word1,和空字符串word2,最近编辑距离为i

      • dp[0][j]=j

        • 以下标j-1为结尾的字符串word2,和空字符串word1,最近编辑距离为j

  • 4.确定遍历顺序

    • 由递推公式可以知道,遍历顺序一定是从上到下,从左到右

  • 5.举例推导dp数组

【解题步骤】

  • 1.定义一个dp数组,长度为两个字符串的长度+1

  • 3.遍历两个字符串

    • 将dp[i][0]初始化为i

    • 将dp[0][j]初始化为j

  • 4.遍历word1

    • 遍历word2

      • 如果两个字符串当前位置的元素相同

        • 递推公式1

      • 如果两个字符串当前位置的元素不同

        • 递推公式2

  • 5.return dp[word1.length()][word2.length()]

【代码部分】

  1. class Solution {
  2. public int minDistance(String word1, String word2) {
  3. int[][] dp = new int[word1.length()+1][word2.length()+1];
  4. for (int i = 0; i < word1.length()+1; i++) dp[i][0] = i;
  5. for (int i = 0; i < word2.length()+1; i++) dp[0][i] = i;
  6. for (int i = 1; i < word1.length() + 1; i++) {
  7. for (int j = 1; j < word2.length() + 1; j++) {
  8. if(word1.charAt(i-1) == word2.charAt(j-1)){
  9. dp[i][j] = dp[i-1][j-1];
  10. }else {
  11. dp[i][j] = Math.min(dp[i-1][j-1]+1,Math.min(dp[i-1][j]+1,dp[i][j-1]+1));
  12. }
  13. }
  14. }
  15. return dp[word1.length()][word2.length()];
  16. }
  17. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/615434
推荐阅读
相关标签
  

闽ICP备14008679号