1.题目解析
题目来源
712.两个字符串的最小ASCII删除和——力扣
测试用例
2.算法原理
1.状态表示
由于如果直接求本题会发现无从下手,不妨根据正难则反的原理,反向求公共子序列的ASCII码最大值即可,于是就转化为求公共子序列的问题,那么就需要一个二维dp判断s1与s2的两个区间的公共子序列的最大ASCII值和,即
dp[i][j]:s1的[0,i]区间与s2的[0,j]区间的公共子序列的最大ASCII码值之和
2.状态转移方程
状态转移方程需要根据两个区间的最后位置来判断如何定义状态转移方程,详细如下图:
3.初始化
这里对dp表多开了一行一列的虚拟位置,全部初始化为0即可
4.填表顺序
从上到下,每一行从左到右
5.返回值
返回两个表的ASCII码值之和减去dp[m][n]的两倍
3.实战代码
代码解析
class Solution {
public:int minimumDeleteSum(string s1, string s2) {int m = s1.size();int n = s2.size();vector<vector<int>> dp(m+1,vector<int>(n+1));for(int i = 1;i <= m;i++){for(int j = 1;j <= n;j++){dp[i][j] = max(dp[i-1][j],dp[i][j-1]);if(s1[i-1] == s2[j-1]){dp[i][j] = max(dp[i][j],dp[i-1][j-1] + s1[i-1]);}}}int sum = 0;for(auto e : s1) sum += e;for(auto e : s2) sum += e;return sum - dp[m][n] - dp[m][n];}
};