昨晚上走之前脑子里混乱就是想不透,回去列了下,是想明白了。主要在于初始化dp[0][i]和dp[j][0]。然而大早上来还是总是报错,而且是错了一次,找的时候还没意识到第二次是相同的错误,就是字符串序号比dp序号少1.
class Solution
{
public:
int minimumDeleteSum(string s1, string s2)
{
int m = s1.size(), n = s2.size();
int dp[m + 1][n + 1];
memset(dp,0,sizeof(dp));
for(int i=1;i<=m;i++)
dp[i][0]+=s1[i-1]+dp[i-1][0];
for(int i=1;i<=n;i++)
dp[0][i]+=s2[i-1]+dp[0][i-1];
for(int i=1;i<=m;i++)
cout<<dp[i][0]<<" ";
for(int i=1;i<=n;i++)
cout<<dp[0][i]<<" ";
for (int i = 1; i <= m; i++)
for (int j = 1; j <= n; j++)
{
if (s1[i - 1] == s2[j - 1])
dp[i][j] = dp[i - 1][j - 1];
else
dp[i][j] = min(dp[i][j-1]+s2[j-1],dp[i-1][j]+s1[i-1]);
//在这里卡了好久,没有意识到序号问题
//dp[i][j] = min(dp[i][j-1]+s2[j],dp[i-1][j]+s1[i]);
}
return dp[m][n];
}
}
;
当然这道题还是可以直接套子序列解法。如下
class Solution
{
public:
int longestCommonSubsequence(string text1, string text2) {
int m=text1.size(),n=text2.size();
int dp[m+1][n+1];
memset(dp,0,sizeof(dp));
for(int i=1;i<=text1.size();i++)
for(int j=1;j<=text2.size();j++)
{
if(text1[i-1]==text2[j-1])
dp[i][j]=dp[i-1][j-1]+text2[j-1];
else
dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
}
return dp[m][n];
}
int minimumDeleteSum(string s1, string s2)
{
int sum=0;
for(int i=0;i<s1.size();i++)
sum+=s1[i];
for(int i=0;i<s2.size();i++)
sum+=s2[i];
int add=longestCommonSubsequence(s1,s2);
return sum-2*add;
}
};