代码随想录算法训练营第五十五天|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()]

【代码部分】

class Solution {
    public int minDistance(String word1, String word2) {
		//初始化、准备工作
		int[][] dp = new int[word1.length() + 1][word2.length() + 1];
		for (int i = 0; i < word1.length() + 1; i++) dp[i][0] = i;
		for (int j = 0; j < word2.length() + 1; j++) dp[0][j] = j;

		//遍历两个word
		for (int i = 1; i < word1.length() + 1; i++) {
			for (int j = 1; j < word2.length() + 1; j++) {
				if(word1.charAt(i-1) == word2.charAt(j-1)){
					dp[i][j] = dp[i-1][j-1];
				}else {
					dp[i][j] =Math.min(dp[i-1][j] + 1, dp[i][j-1] + 1);
				}
			}
		}
		return dp[word1.length()][word2.length()];
    }
}

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()]

【代码部分】

class Solution {
    public int minDistance(String word1, String word2) {
		int[][] dp = new int[word1.length()+1][word2.length()+1];
		for (int i = 0; i < word1.length()+1; i++) dp[i][0] = i;
		for (int i = 0; i < word2.length()+1; i++) dp[0][i] = i;

		for (int i = 1; i < word1.length() + 1; i++) {
			for (int j = 1; j < word2.length() + 1; j++) {
				if(word1.charAt(i-1) == word2.charAt(j-1)){
					dp[i][j] = dp[i-1][j-1];
				}else {
					dp[i][j] = Math.min(dp[i-1][j-1]+1,Math.min(dp[i-1][j]+1,dp[i][j-1]+1));
				}
			}
		}
		return dp[word1.length()][word2.length()];
    }
}

  • 25
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值