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两个字符间的字符都放进去,就可以了。

posted @ 2019-09-25 15:44  于老师的父亲王老爷子  阅读(11)  评论(0)    收藏  举报