原题链接:
https://leetcode.cn/problems/delete-operation-for-two-strings/description/
完成情况:
解题思路:
第一个代码段
实现了计算将一个字符串转换成另一个字符串所需的最小操作次数。其中操作包括插入、删除和替换字符。具体步骤如下:
- 创建一个二维数组 d p dp dp 存储 w o r d 1 word1 word1 和 w o r d 2 word2 word2 之间最长相同子序列的长度。
- 使用动态规划的方法,遍历 w o r d 1 word1 word1 和 w o r d 2 word2 word2 的所有字符,比较它们是否相等。
- 如果当前字符相等, d p [ i ] [ j ] dp[i][j] dp[i][j] 等于 d p [ i − 1 ] [ j − 1 ] + 1 dp[i-1][j-1] + 1 dp[i−1][j−1]+1,表示当前字符属于最长相同子序列。
- 如果当前字符不相等, d p [ i ] [ j ] dp[i][j] dp[i][j] 等于 d p [ i − 1 ] [ j ] dp[i-1][j] dp[i−1][j] 和 d p [ i ] [ j − 1 ] dp[i][j-1] dp[i][j−1] 中的较大值,表示不同位置的最长相同子序列长度。
- 最终返回 l e n 1 + l e n 2 − d p [ l e n 1 ] [ l e n 2 ] ∗ 2 len1 + len2 - dp[len1][len2] * 2 len1+len2−dp[len1][len2]∗2,即两个字符串的长度减去最长相同子序列的长度的两倍。
第二个代码段
实现了计算将一个字符串转换成另一个字符串所需的最小操作次数,这里的操作只包括删除字符。具体步骤如下:
- 创建一个二维数组 d p dp dp 存储需要删除的字符个数。
- 初始化 d p dp dp 数组的第一行和第一列,分别表示将一个空字符串转换成 w o r d 1 word1 word1 和 w o r d 2 word2 word2 所需的操作次数。
- 使用动态规划的方法,遍历 w o r d 1 word1 word1 和 w o r d 2 word2 word2 的所有字符,比较它们是否相等。
- 如果当前字符相等, d p [ i ] [ j ] dp[i][j] dp[i][j] 等于 d p [ i − 1 ] [ j − 1 ] dp[i-1][j-1] dp[i−1][j−1],表示不需要删除字符。
- 如果当前字符不相等, d p [ i ] [ j ] dp[i][j] dp[i][j] 等于 d p [ i − 1 ] [ j − 1 ] + 2 dp[i-1][j-1] + 2 dp[i−1][j−1]+2、 d p [ i − 1 ] [ j ] + 1 dp[i-1][j] + 1 dp[i−1][j]+1 和 d p [ i ] [ j − 1 ] + 1 dp[i][j-1] + 1 dp[i][j−1]+1 中的最小值,表示替换、删除和插入字符操作中的最小次数。
- 最终返回 d p [ w o r d 1. l e n g t h ( ) ] [ w o r d 2. l e n g t h ( ) ] dp[word1.length()][word2.length()] dp[word1.length()][word2.length()],即将 w o r d 1 word1 word1 转换成 w o r d 2 word2 word2 所需的最小操作次数。
参考代码:
_583两个字符串的删除操作_匹配法dp
package 代码随想录.动态规划;
public class _583两个字符串的删除操作_匹配法dp {
//给定两个单词 word1 和 word2 ,返回使得 word1 和 word2 相同所需的最小步数。
// dp数组中存储word1和word2最长相同子序列的长度
// 首先划分一个相同长度的单元格,先匹配出最优的相似情况,然后 检测不同的情况即可。
public int minDistance(String word1, String word2) {
int len1 = word1.length();
int len2 = word2.length();
int dp [][] = new int[len1 + 1][len2 + 1];
for (int i = 1;i<=len1;i++){
for (int j = 1;j<=len2;j++){
//逐一去进行匹配,找到最优的合适位置
if (word1.charAt(i-1) == word2.charAt(j - 1)){
dp[i][j] = dp[i-1][j-1]+1;
}else {
dp[i][j] = Math.max(dp[i-1][j],dp[i][j-1]);
}
}
}
return len1 + len2 - dp[len1][len2] * 2;
}
}
_583两个字符串的删除操作_删除法dp
package 代码随想录.动态规划;
public class _583两个字符串的删除操作_删除法dp {
// dp数组中存储需要删除的字符个数
public int minDistance(String word1, String word2){
int len1 = word1.length()+1;
int len2 = word2.length()+1;
int dp [][] = new int[len1][len2];
for (int i = 0; i < len1; i++) {
dp[i][0] = i;
}
for (int j = 0; j < len2; j++) {
dp[0][j] = j;
}
for (int i = 1; i < len1; i++) {
for (int j = 1;j<len2;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] + 2,Math.min(dp[i-1][j] + 1,dp[i][j-1] + 1));
}
}
}
return dp[word1.length()][word2.length()];
}
}