题目描述:
所有 DNA 都由一系列缩写为 A,C,G 和 T 的核苷酸组成,例如:“ACGAATTCCG”。在研究 DNA 时,识别 DNA 中的重复序列有时会对研究非常有帮助。
编写一个函数来查找目标子串,目标子串的长度为 10,且在 DNA 字符串 s 中出现次数超过一次。
示例:
输入:s = “AAAAACCCCCAAAAACCCCCCAAAAAGGGTTT”
输出:[“AAAAACCCCC”, “CCCCCAAAAA”]
方法1:
主要思路:
(1)使用unordered_map来存储已经出现过的字符串,用来快速确定出现过的字符串;
(2)重复的字符串只统计一次,压入结果中,通过对应的int值来实现;
class Solution {
public:
vector<string> findRepeatedDnaSequences(string s) {
unordered_map<string,int> mp;
int end_s=s.size()-9;//终止位置
vector<string> vec;
for(int i=0;i<end_s;++i){//查询所有的可能的字符串
if(mp.count(s.substr(i,10))){//若字符串出现过
if(mp[s.substr(i,10)]==0){//且没有统计过
vec.push_back(s.substr(i,10));
mp[s.substr(i,10)]=1;
}
}
else{
mp[s.substr(i,10)]=0;//标识出现过的字符串
}
}
return vec;
}
};
和方法1一样,只是修改了一下判断逻辑;
class Solution {
public:
vector<string> findRepeatedDnaSequences(string s) {
unordered_map<string,int> mp;
int end_s=s.size()-9;
vector<string> vec;
for(int i=0;i<end_s;++i){
string tmp=s.substr(i,10);
if(mp[tmp]==1){
vec.push_back(tmp);
}
++mp[tmp];
}
return vec;
}
};