一、583. 两个字符串的删除操作
注意的点:
- 若比较的字符相等,则就是左上角的dp值
- 若比较的字符不相等,则取(左侧值+1、上侧值+1、左上角值+2)的最小值。
以下是代码部分:
public class 两个字符串的删除操作583 {
public int minDistance(String word1, String word2) {
int[][] dp = new int[word1.length()+1][word2.length()+1];
//初始化,与空字符串相同,就需要剪掉i、j个字符
for (int i = 0; i < dp.length; i++) {
dp[i][0] = i;
}
for (int i = 0; i < dp[0].length; i++) {
dp[0][i] = i;
}
//[1]也要初始化,因为涉及到 -2 的操作
for (int i = 1; i < dp.length; i++) {
if(word1.charAt(i-1) == word2.charAt(0))
dp[i][1] = 0;
else
dp[i][1] = 1;
}
//遍历
for (int i = 1; i < dp.length; i++) {
for (int j = 1; j < dp[0].length; j++) {
//如果相等,则不需要删除
if(word1.charAt(i-1) == word2.charAt(j-1))
dp[i][j] = dp[i-1][j-1];
/*
//踩坑,这里是左方和上方,而不是 -1、-2
//如果与前一个字符相等,
else if(word1.charAt(i-1) == word2.charAt(j-2))
//dp[i][j] = dp[i-1][j-2] + 1;
dp[i][j] = dp[i][j-1] + 1;
else if(word1.charAt(i-2) == word2.charAt(j-1))
//dp[i][j] = dp[i-2][j-1] + 1 ;
dp[i][j] = dp[i-1][j] + 1 ;
else
dp[i][j] =dp[i-1][j-1] + 2;
*/
else
dp[i][j] = Math.min(dp[i-1][j], dp[i][j-1]) + 1;
}
}
return dp[word1.length()][word2.length()];
}
}
二、72. 编辑距离
- 增:当前长度 word1 i, word2 j-1。此时,word2增加一个字符,则word1 若想变成word2,需要在word1后边添加一个相同的字符,即dp[i][j] = dp[i][j-1] + 1;
- 删:当前长度 word1 i-1, word2 j。此时,word1增加了一个字符,导致变得不同,若想变成word2,则要把这个新字符删除,即dp[i][j] = dp[i-1][j] + 1;
- 改:当前长度 word1 i-1, word2 j-1。此时,word1、word2都增加了一个字符,导致变得不同,若想变成word2,则要把word1最后增加的字符变成word2的那个字符,即dp[i][j] = dp[i-1][j-1] + 1;
以下是代码部分:
public class 编辑距离72 {
public int minDistance(String word1, String word2) {
int[][] dp = new int[word1.length()+1][word2.length()+1];
//初始化
//长为i的字符串 转化为 空字符串,需删除 i 个字符
for (int i = 0; i < dp.length; i++) {
dp[i][0] = i;
}
//空字符串 转化为 长度为i 的字符串,需添加 i 个字符
for (int i = 1; i < dp[0].length; i++) {
dp[0][i] = i;
}
//遍历
for (int i = 1; i < dp.length; i++) {
for (int j = 1; j < dp[0].length; j++) {
//如果相等,则不需要额外的操作
if(word1.charAt(i-1) == word2.charAt(j-1))
dp[i][j] = dp[i-1][j-1];
//否则,选取增、删、改中总操作数最小的那一个操作
//增:当前长度 word1 i, word2 j-1。此时,word2增加一个字符,则word1 若想变成word2,需要在word1后边添加一个相同的字符,即dp[i][j] = dp[i][j-1] + 1;
//删:当前长度 word1 i-1, word2 j。此时,word1增加了一个字符,导致变得不同,若想变成word2,则要把这个新字符删除,即dp[i][j] = dp[i-1][j] + 1;
//改:当前长度 word1 i-1, word2 j-1。此时,word1、word2都增加了一个字符,导致变得不同,若想变成word2,则要把word1最后增加的字符变成word2的那个字符,即dp[i][j] = dp[i-1][j-1] + 1;
else
dp[i][j] = Math.min(dp[i][j-1],Math.min(dp[i-1][j], dp[i-1][j-1])) + 1;
}
}
return dp[word1.length()][word2.length()];
}
}