赞
踩
题目链接: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()];
- }
- }
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()];
- }
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。