这道问题因为数据量太大,如果存储字符的话,会造成内存过多。所以需要转换为位存储。
因为有四个数,A,C,G,T. 那么可以分别用00,01,10,11来表示。那么就可以每次将原来的数字乘以4,再加上新数字就可以了。因为要寻找是个的字符。
所以每次的最后求和过后的数字与0xFFFFF做与运算就能把最靠前的超过是个的数字去掉。
class Solution {
public:
vector<string> findRepeatedDnaSequences(string s) {
map<char,int> strmap;
unordered_map<int,int> dict;
vector<string> ret;
strmap.insert(make_pair('A',0));
strmap.insert(map<char,int>::value_type('C',1));
strmap.insert({map<char,int>::value_type('G',2),map<char,int>::value_type('T',3)});
int sum = 0;
cout<<s.size()<<endl;
for(int i =0 ;i<s.size();i++)
{
sum = (sum*4 + strmap[s[i]]) & 0xFFFFF;
if( i < 9 ) continue;
if(dict[sum] ++ == 1)
ret.push_back(s.substr(i-9,10));
}
return ret;
}
};