1092. Shortest Common Supersequence

这题比较有意思,又是距离解出hard一步之遥。
自己的做法:
class Solution {
public:
string shortestCommonSupersequence(string str1, string str2) {
int sz1 = str1.size(), sz2 = str2.size();
if (sz1 == 0 || sz2 == 0)
return str1 + str2;
vector<vector<string>> dp(sz1+1, vector<string>(sz2+1));
for (int i = 1; i <= sz1; ++i)
dp[i][0] = str1.substr(0, i);
for (int j = 1; j <= sz2; ++j)
dp[0][j] = str2.substr(0, j);
for (int i = 1; i <= sz1; ++i)
for (int j = 1; j <= sz2; ++j) {
if (str1[i-1] == str2[j-1])
dp[i][j] = dp[i-1][j-1] + str1[i-1];
else {
if (dp[i-1][j].size() < dp[i][j-1].size())
dp[i][j] = dp[i-1][j] + str1[i-1];
else
dp[i][j] = dp[i][j-1] + str2[j-1];
}
}
return dp.back().back();
}
};
很普通的dp,但是做的时候就感觉不太好,因为这样总是感觉内存使用太大,后来内存确实超过了。
然后评论区的做法:
class Solution {
public:
string shortestCommonSupersequence(string str1, string str2) {
string lcs = findLCS(str1, str2);
int i = 0, j = 0;
stringstream ss;
for (char c : lcs) {
while (str1[i] != c)
ss << str1[i++];
while (str2[j] != c)
ss << str2[j++];
ss << c;
++i;
++j;
}
ss << (str1.substr(i) + str2.substr(j));
return ss.str();
}
private:
string findLCS(string& str1, string& str2) {
int sz1 = str1.size(), sz2 = str2.size();
if (sz1 == 0 || sz2 == 0)
return "";
vector<vector<string>> dp(sz1+1, vector<string>(sz2+1, ""));
for (int i = 1; i <= sz1; ++i)
for (int j = 1; j <= sz2; ++j) {
if (str1[i-1] == str2[j-1])
dp[i][j] = dp[i-1][j-1] + str1[i-1];
else
dp[i][j] = (dp[i-1][j].size() > dp[i][j-1].size()? dp[i-1][j] : dp[i][j-1]);
}
return dp.back().back();
}
};
就是找到lcs,然后把对应缺失的字符放进去
没有自己做出这种做法的原因是:
其实是想到了LCS的,但是两个原因:1.要求出LCS还是要用二维数组存储string,感觉依然内存使用很多。2.就算算出lcs了,后面怎么做还是有点模糊的。
其实忽略了,lcs相对题目要求的超string是短的很多的,所以它很可能不超出内存。
然后,对于第二点,需要想到:求出了lcs,它对于两个string来说,都是它们内部某些位置的字符按顺序的组合,所以说,只需要把它们在lcs两个字符间的字符都放进去,就可以了。
浙公网安备 33010602011771号