每日一练:两个字符串的最小ASCLL删除和
712. 两个字符串的最小ASCII删除和 - 力扣(LeetCode)
题目要求:
给定两个字符串s1
和 s2
,返回 使两个字符串相等所需删除字符的 ASCII 值的最小和 。
示例 1:
输入: s1 = "sea", s2 = "eat" 输出: 231 解释: 在 "sea" 中删除 "s" 并将 "s" 的值(115)加入总和。 在 "eat" 中删除 "t" 并将 116 加入总和。 结束时,两个字符串相等,115 + 116 = 231 就是符合条件的最小和。
示例 2:
输入: s1 = "delete", s2 = "leet" 输出: 403 解释: 在 "delete" 中删除 "dee" 字符串变成 "let", 将 100[d]+101[e]+101[e] 加入总和。在 "leet" 中删除 "e" 将 101[e] 加入总和。 结束时,两个字符串都等于 "let",结果即为 100+101+101+101 = 403 。 如果改为将两个字符串转换为 "lee" 或 "eet",我们会得到 433 或 417 的结果,比答案更大。
提示:
0 <= s1.length, s2.length <= 1000
s1
和s2
由小写英文字母组成
解法-1 动态规划 O(N^2):
这个题需要逆向思维,求删除的最小和,那么我们可以求公共子序列的最大和;
得到最大和后,用两个字符串-2*最大和得到的就是最小和。
class Solution {
public:int minimumDeleteSum(string s1, string s2) {int n = s1.size();int m = s2.size();int sum = 0;for(const char c:s1) sum+=c;for(const char c:s2) sum+=c;vector<vector<int>> dp(n+1,vector<int>(m+1));for(int i = 1;i <= n;i++){for(int j = 1;j <= m;j++){if(s1[i-1]==s2[j-1])dp[i][j]=dp[i-1][j-1]+s1[i-1];elsedp[i][j]=max(dp[i-1][j],dp[i][j-1]);}}sum-=2*dp[n][m];return sum;}
};