题目
思路一 哈希表
建立10位字符子串和该子串出现个数的哈希表,如果次数为2就push进数组。
代码一
class Solution {
const int L = 10;
public:
vector<string> findRepeatedDnaSequences(string s) {
vector<string> ans;
unordered_map<string, int> cnt;
int n = s.length();
for (int i = 0; i <= n - L; ++i) {
string sub = s.substr(i, L);
if (++cnt[sub] == 2) {
ans.push_back(sub);
}
}
return ans;
}
};
思路二 哈希表+滑动窗口+位运算
一共有四种可能出现的字符,每个字符可以用两个二进制位表示,int有32个二进制位,所以可以用一个int型数据表示10个字符。加入一个新字符的操作:先将现在的数据左移两位,在和这个新字符做与操作,再只截取后20位。
代码二
class Solution {
const int L=10;
unordered_map<char,int> bin={{'A',0},{'C',1},{'G',2},{'T',3}};
public:
vector<string> findRepeatedDnaSequences(string s) {
int n=s.length(),x=0;
unordered_map<int,int> cnt;
vector<string> v;
if(n<=L)
return v;
for(int i=0;i<L-1;i++) //第一个哈希值计算
x=(x<<2)|bin[s[i]];
for(int i=L-1;i<n;i++){
x=(x<<2|bin[s[i]])&((1<<2*L)-1);
if(++cnt[x]==2)
v.push_back(s.substr(i-L+1,L));
}
return v;
}
};