LeetCode 187. Repeated DNA Sequences

这道问题因为数据量太大,如果存储字符的话,会造成内存过多。所以需要转换为位存储。

因为有四个数,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;
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值