LeetCode: Repeated DNA Sequences

本文介绍了一个使用GCC编译环境下实现的DNA序列编码算法及如何通过该算法找出给定DNA字符串中的所有重复出现的10字母长的子序列。通过对DNA字母进行数字编码,可以高效地在内存中存储和比较DNA片段。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一定要用gcc调试。。。贪图vs的编辑方便,在本机上都过的case就是提交不能过。。。 换了gcc才发现问题。

static const char digit2char[4] = { 'A', 'C', 'G', 'T' };
                                 //A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T
static const int char2digit[26] = {0,0,1,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,3};

int32_t encodeDNA(const string& s, int begin)
{
	int32_t r = 0;
	for (int i = begin; i < 10; i++){
		r = r | (char2digit[s[i] - 'A'] << (2 * (9 - i)));
	}
	return r;
}

string decodeDNA(int32_t val)
{
	char res[11] = { 0 };
	for (int i = 0; i < 10; i++){
		res[i] = digit2char[(val >> (2 * (9 - i))) & 3];
	}
	return string(res);
}

int32_t shiftRightByOne(int32_t val, char c)
{
	int32_t res = ((val & 0x3ffff) << 2) |(char2digit[c-'A']);
	return res;
}
vector<string> findRepeatedDnaSequences(string s) {
	vector<string> res;
	if (s.length() <= 10){
		return res;
	}
	unordered_map<int32_t, size_t> checkMap;
	set<int32_t> tmpRes;
	int32_t encodeVal = encodeDNA(s, 0);
	checkMap.insert(make_pair(encodeVal, 9));
	for (int i = 10; i < s.length(); i++){
		encodeVal = shiftRightByOne(encodeVal,s[i]);
		auto it = checkMap.find(encodeVal);
		if (it == checkMap.end()){
			checkMap.insert(make_pair(encodeVal,i));
		}
		else{
			tmpRes.insert(encodeVal);
		}
	}
	for (auto& i : tmpRes){
		res.push_back(decodeDNA(i));
	}
	return res;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值