代码随想录
583. 两个字符串的删除操作
思路
思路:跟最长公共子序列的意思是一样的,删除的步数=两个字符串总长度-2*最长的子序列长度
dp[i][j]表示字符串A从0-i-1和字符串B从0-j-1的最长公共子序列的长度
dp[0][0]=0
递推:
if(c1[i-1] == c2[j-1]) dp[i][j]=dp[i-1][j-1]+1;
else dp[i][j]=max(dp[i-1][j],dp[i][j-1])
代码
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();i++){
for(int j = 1;j<=word2.length();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 word1.length()+word2.length()-2*dp[word1.length()][word2.length()];
}
}
72. 编辑距离
思路
题解思路:
动态规划:定义dp[i][j]表示word1的0-i-1子串,以及word2的0-j-1子串最近编辑距离为递推公式:
if(word1[i-1] == word2[j-1])
无操作 dp[i][j] = dp[i-1][j-1]
else
增 和删除效果一样
删 dp[i-1][j]+1,dp[i][j-1]+1
换 dp[i-1][j-1]+1
这三种取最小
初始化:
dp[i][0]=i
dp[0][j]=j
代码
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();i++){
dp[i][0]=i;
}
for(int j = 0;j<=word2.length();j++){
dp[0][j]=j;
}
for(int i = 1;i<=word1.length();i++){
for(int j = 1;j<=word2.length();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],Math.min(dp[i-1][j],dp[i][j-1]))+1;
}
}
}
return dp[word1.length()][word2.length()];
}
}