187. Repeated DNA Sequences

在这里插入图片描述

学习一下如何编码来节省空间。

首先自己的做法简单粗暴:

class Solution {
public:
    vector<string> findRepeatedDnaSequences(string s) {
        if (s.size() < 10)
            return vector<string>();
        unordered_map<string, int> cnts;
        for (int i = 0; i < s.size()-9; ++i)
            cnts[s.substr(i, 10)]++;
        vector<string> res;
        for (auto& item : cnts) 
            if (item.second > 1)
                res.push_back(item.first);
        return res;
    }
};

然后看了评论区,学了一种节省空间的做法:
1.只有四个字母,所以可以每个用两个bit来编码:00, 01, 10, 11
2.因为长度只有10个字母,所以最多每个字符串有20个bit,所以可以放到一个int里面。
所以:

class Solution {
public:
    vector<string> findRepeatedDnaSequences(string s) {
        if (s.size() < 10)
            return vector<string>();
        unordered_set<int> hasSeen, hasAdded;
        vector<int> encode(26, 0);
        encode['C' - 'A'] = 1;
        encode['G' - 'A'] = 2;
        encode['T' - 'A'] = 3;
        vector<string> res;
        for (int i = 0; i < s.size()-9; ++i) {
            int code = 0;
            for (int j = i; j <= i + 9; ++j) {
                code |= encode[s[j] - 'A'];
                code <<= 2;
            }
            if (hasSeen.find(code) == hasSeen.end()) 
                hasSeen.insert(code);
            else if (hasSeen.find(code) != hasSeen.end() && hasAdded.find(code) == hasAdded.end()) {
                hasAdded.insert(code);
                res.push_back(s.substr(i, 10));
            }
        }
        return res;
    }
};

着重学习一下这里是如何编码的,是用它们相对于’A’的大小来编码的。

posted @ 2019-10-08 11:29  于老师的父亲王老爷子  阅读(22)  评论(0)    收藏  举报