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’的大小来编码的。
浙公网安备 33010602011771号