
方法一:滑动窗口+哈希表
class Solution {
public:
vector<string> findRepeatedDnaSequences(string s) {
vector<string> ans;
map<string,int> mp;//map存储
for(int i = 0; i + 9 < s.size(); i++){
string str = s.substr(i,10);//substr截取子串
mp[str]++;//加入map中
if(mp[str] == 2){//若出现两次存入数组,出现两次以上不需要重复添加所以==2
ans.push_back(str);
}
}
return ans;
}
};
方法二:bitset存储
class Solution {
public:
vector<string> findRepeatedDnaSequences(string s) {
unordered_map<char,int> m{{'A',0},{'C',1},{'G',2},{'T',3}};//hash表中存储四个字母,分别对应二进制00,01,10,11
int val = 0 , mask = (1 << 20) - 1;//val代表每个字符串对应值,mask用于舍去右移后第一,二位的值
bitset<1<<20> b1,b2;//用bitset作为hash表存储每个字符串对应的值,b1判断值是否存在两次及以上,b2判断是否存入数组
vector<string> res;
for(int i = 0; i < 10; i++){//先找第一个字符串对应值
val = ((val << 2) & mask) + m[s[i]];
}
b1.set(val);//hash存储,val作下标,标记为true
for(int i = 10; i < s.size(); i++){
val = ((val << 2)&mask) + m[s[i]];//移除第一个字母的值,传入下一字母的值
if(b2.test(val)){//判断是否存入数组,去重
continue;
}
if(b1.test(val)){//是否在之前出现过,出现过则此时为第二次,所以放入数组,b2标记
res.push_back(s.substr(i-9,10));
b2.set(val);
}else{//否则b1标记
b1.set(val);
}
}
return res;
}
};
本文介绍两种高效检测DNA序列中重复子序列的方法:滑动窗口结合哈希表及bitset存储技术。通过实例代码展示了如何利用这两种方法快速找出长度为10的重复DNA片段。
741

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



