题目描述
给定两个字符串s1 和 s2,返回 使两个字符串相等所需删除字符的 ASCII 值的最小和 。
示例
![在这里插入图片描述](https://img-blog.csdnimg.cn/d9db08d0d1b746d49e4206ad4a2064dd.png)
思路
这个题的解法一和最长公共子序列的解法大致相同,我们可以在此代码基础上稍微更改即可。
代码如下
解法一
public int minimumDeleteSum1(String s1, String s2) {
int m = s1.length(), n = s2.length();
int[][] dp = new int[m + 1][n + 1];
int res = 0;
for(char c : s1.toCharArray()){
res += c;
}
for(char c : s2.toCharArray()){
res += c;
}
for(int i = 1;i < dp.length;i++){
for(int j = 1;j < dp[0].length;j++){
if(s1.charAt(i - 1) == s2.charAt(j - 1)){
dp[i][j] = dp[i - 1][j - 1] + s1.charAt(i - 1) * 2;
}else{
dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);
}
}
}
return res - dp[m][n];
}
解法二
![在这里插入图片描述](https://img-blog.csdnimg.cn/df19d764caf5495e8d1497e9e5d753d7.png)
public int minimumDeleteSum(String s1, String s2) {
int m = s1.length(), n = s2.length();
int[][] dp = new int[m + 1][n + 1];
for(int i = 1;i < m + 1;i++){
dp[i][0] = dp[i - 1][0] + s1.charAt(i - 1);
}
for(int i = 1;i < n + 1;i++){
dp[0][i] = dp[0][i - 1] + s2.charAt(i - 1);
}
for(int i = 1;i < dp.length;i++){
for(int j = 1;j < dp[0].length;j++){
if(s1.charAt(i - 1) == s2.charAt(j - 1)){
dp[i][j] = dp[i - 1][j - 1];
}else{
dp[i][j] = Math.min(dp[i - 1][j] + s1.charAt(i - 1), dp[i][j - 1] + s2.charAt(j - 1));
}
}
}
return dp[m][n];
}