基于最长公共子序列(不连续)问题,若当前相等,dp[i][j] = dp[i-1][j-1]+s1[i]+s2[j]
否则,dp[i][j] = max(dp[i-1][j], dp[i][j-1])
考虑边界,加一圈0
以sea eat为例:
0 | 1 | 2 | 3 | |
0 | 0 | 0 | 0 | 0 |
1 | 0 | 0 | e | e |
2 | 0 | 0 | e | ea |
3 | 0 | 0 | e | ea |
代码如下:
class Solution {
public:
int minimumDeleteSum(string s1, string s2) {
int m = s1.size(), n = s2.size();
int dp[1111][1111]={0};
for(int i=0; i<m; i++)
for(int j=0; j<n; j++)
{
if(s1[i]==s2[j])
dp[i+1][j+1] = dp[i][j]+2*int(s1[i]);
else
dp[i+1][j+1] = max(dp[i+1][j], dp[i][j+1]);
}
int all = 0;
for(auto c:s1)all+=c;
for(auto c:s2)all+=c;
return all - dp[m][n];
}
};