具体思路:
字符串哈希化,想到双二进制位,但是没有动手做,题解是这样做的;
注意一下int可能左移未定义问题;
很傻逼,不知道自己的代码为什么过不了,只能改成uint;
具体代码:
1.字符串hash数值化:
using ll=long long;
class Solution {
public:
vector<string> findRepeatedDnaSequences(string s) {
vector<string>ret;
unordered_map<ll, int>ump;
unordered_map<char, int> char2num={{'A',1},{'C',2},{'G',3},{'T',4}};
ll cnt=0;
for(int i=0;i<10;i++){
cnt=cnt*5+char2num[s[i]];
}
int index=1;
ump[cnt]=1;
ll non_var=pow(5,9);
while(index+9<s.size()){
cnt-=non_var*(char2num[s[index-1]]);
cnt=cnt*5+char2num[s[index+9]];
ump[cnt]++;
if(ump[cnt]==2){
ret.push_back(s.substr(index,10));
}
index++;
}
return ret;
}
};
2.字符串二进制哈希化:
class Solution {
public:
vector<string> findRepeatedDnaSequences(string s) {
vector<string>ret;
unordered_map<int, int>ump;
unordered_map<char, uint32_t> char2num={{'A',0},{'C',1},{'G',2},{'T',3}};
uint32_t cnt=0;
uint32_t flag=1;
for(int i=0;i<10;i++){
cnt=(cnt<<2)|char2num[s[i]];
//flag=(flag<<2)|3;
}
flag=(flag<<20)-1;
int index=1;
ump[cnt]=1;
while(index+9<s.size()){
cnt=cnt<<2;
cnt|=char2num[s[index+9]];
int temp=cnt&flag;
ump[temp]++;
if(ump[temp]==2){
ret.push_back(s.substr(index,10));
}
index++;
}
return ret;
}
};