题目链接:https://leetcode.cn/problems/minimum-ascii-delete-sum-for-two-strings/
一.题目介绍
二.题目分析
此题目要求获得两个字符串在删除部分子序列后相等时,删除子序列ASCII值的最小和。我们正着分析题目时,发现题目的约束条件有很多时不容易分析时我们在反向推导题目。求的是删除的子序列ASCII值的最小和,反过来剩下的相同序列ASCII值就是最大和,以这个思路继续分析,整个题目的求解方法就与"最长公共子序列"相同了,所以首先我们得保证求出两个字符串的公共子序列,其次要求公共子序列一定是最长的,只有最长的公共子序列ASCII值的和才是最大的。
三.完整代码
int minimumDeleteSum(string s1, string s2)
{
int m = s1.size(), n = s2.size(), sum = 0;
for(auto it : s1)
{
sum += it;
}
for(auto it : s2)
{
sum += it;
}
s1 = " " + s1, s2 = " " + s2;
vector<vector<int>> dp(m+1, vector<int>(n+1));
for(int i = 1; i < m+1; i++)
{
for(int j = 1; j < n+1; j++)
{
if(s1[i] == s2[j])
{
dp[i][j] = dp[i-1][j-1] + s1[i] + s2[j];
}
else
{
dp[i][j] = max(dp[i-1][j], dp[i][j-1]);
}
}
}
return sum - dp[m][n];
}