思路:
编码:
A ~ 00
C ~ 01
G ~ 10
T ~ 11
所以10个字符只需要20位就可以表示,共有 220 种情况,所以hash table的大小就是 1024∗1024 。
不断的向前移动2位来构造val,在hash table中查找看是否出现的次数大于1,是的话加入set,最后整理结果。
class Solution {
private:
int getCode(char ch) {
if(ch == 'A') return 0;
if(ch == 'C') return 1;
if(ch == 'G') return 2;
if(ch == 'T') return 3;
}
public:
vector<string> findRepeatedDnaSequences(string s) {
vector<string> res;
set<string> ss;
if(s.length() < 10) return res;
int htable[1024 * 1024] = {0};
unsigned int val = 0;
for(int i = 0; i < 9; ++i) {
val <<= 2;
val |= getCode(s[i]);
}
for(int i = 9; i < s.length(); ++i) {
val <<= 14;
val >>= 12;
val |= getCode(s[i]);
htable[val]++;
if(htable[val] > 1) {
ss.insert(s.substr(i - 9, 10));
}
}
for(set<string>::iterator i = ss.begin(); i != ss.end(); ++i) {
res.push_back(*i);
}
return res;
}
};
本文介绍了一种基于哈希表的DNA序列重复性检测算法,通过编码将DNA字符转换为整数,利用滑动窗口在序列中查找重复子序列,并使用哈希表和集合记录重复次数超过一次的子序列。
392

被折叠的 条评论
为什么被折叠?



