LeetCode 187. Repeated DNA Sequences(位运算,hash)
Posted Shendu.cc
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 187. Repeated DNA Sequences(位运算,hash)相关的知识,希望对你有一定的参考价值。
题意:判断一个DNA序列中,长度为10的子序列,重复次数超过1次的序列!
题解:用一个map 就能搞定了,但是出于时间效率的优化,我们可以用位运算和数组代替map,首先只有四个字母,就可以用00,01,10,11 四个二进制表示,长度为10的序列,可以用长度为20的二进制序列表示。这样每中组合都对应一个数字,然后用数组表示每个数字出现的次数就好了。
class Solution {
public:
int m[1<<21];
int m3[1<<21];
int m2[127];
char m4[4];
vector<string> findRepeatedDnaSequences(string s) {
m2['A']=0;
m2['C']=1;
m2['G']=2;
m2['T']=3;
m4[0]='A';
m4[1]='C';
m4[2]='G';
m4[3]='T';
int x=0;
for(int i=0;i<10&&i<s.length();i++)
{
x<<=2;
x |= m2[s[i]];
}
m[x]=1;
int y = (1<<18)-1;
vector<string> ans;
for(int i=10;i<s.length();i++)
{
x &= y;
x <<= 2;
x |= m2[s[i]];
m[x]++;
if(m[x]>1 && m3[x]==0)
{
ans.push_back(fun(x));
m3[x]=1;
}
}
return ans;
}
string fun(int x)
{
string s="";
int y ;
for(int i=19;i>=1;i-=2)
{
y = (1 << i) | ( 1<<(i-1));
int z = x&y;
z >>= (i-1);
s+=m4[z];
}
return s;
}
};
以上是关于LeetCode 187. Repeated DNA Sequences(位运算,hash)的主要内容,如果未能解决你的问题,请参考以下文章
Leetcode 187 Repeated DNA Sequences
LeetCode 187. Repeated DNA Sequences 20170706 第三十次作业
[LeetCode] 187. Repeated DNA Sequences 求重复的DNA序列
[LeetCode] 187. Repeated DNA Sequences