583. 两个字符串的删除操作
https://leetcode.cn/problems/delete-operation-for-two-strings/
第一种思路是前面题目最长子序列的变体,只需要让两个长度之和减去两个最长子序列长度即可。
class Solution {
public int minDistance(String word1, String word2) {
int[][] dp=new int[word1.length()+1][word2.length()+1];
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]+1;
}else{
dp[i][j]=Math.max(dp[i][j-1],dp[i-1][j]);
}
}
}
return word1.length()+word2.length()-2*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;
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]+2,Math.min(dp[i-1][j]+1,dp[i][j-1]+1));
}
}
}
return dp[word1.length()][word2.length()];
}
}
72. 编辑距离
https://leetcode.cn/problems/edit-distance/
和上一题非常相似,不同在于dp[i-1][j-1]+1
,本题不需要序偶两个操作,知识替换一个就可以了。
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;
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()];
}
}