DNA序列 由一系列核苷酸组成,缩写为 ‘A’, ‘C’, ‘G’ 和 ‘T’.。例如,“ACGAATTCCG” 是一个 DNA序列 。在研究 DNA 时,识别 DNA 中的重复序列非常有用。
-
给定一个表示 DNA序列 的字符串 s ,返回所有在 DNA 分子
中出现不止一次的长度为 10 的序列
(子字符串)。你可以按 任意顺序 返回答案。 -
示例 1:
输入:s = “AAAAACCCCCAAAAACCCCCCAAAAAGGGTTT”
输出:[“AAAAACCCCC”,“CCCCCAAAAA”] -
示例 2:
输入:s = “AAAAAAAAAAAAA”
输出:[“AAAAAAAAAA”]
//#include <stdio.h>
//#include <algorithm>
#include<vector>
#include<queue>
#include<iostream>
#include<memory>
#include <unordered_map>
using namespace std;
class Solution {
public:
vector<string> findRepeatedDnaSequences(string s) {
vector<string> res = {};
//return res;
int left = 0;
unordered_map<string,int> mymap;
for(int right=9;right<s.size();){
if(s.size()<=10){
return {};
}
int window_len = right-left+1;
if(window_len<10){
right++;
}
if(window_len == 10){
if(mymap.find(s.substr(left,10)) == mymap.end()){
mymap[s.substr(left,10)] = 1;
}else{
mymap[s.substr(left,10)] = mymap[s.substr(left,10)] + 1;
}
left++;//not window_len >10
}
// if(window_len >10){
// if(left== s.size()-10+1){
// break;
// }else{
// left++;
// }
// }
}
for(unordered_map<string,int>::iterator it = mymap.begin(); it != mymap.end(); ++it){
if(it->second>=2){
res.push_back(it->first);
}
}
return res;
}
};
int main()
{
//Solution *myslo = new Solution();
unique_ptr<Solution> myslo = unique_ptr<Solution>(new Solution());
string s = "AAAAACCCCCAAAAACCCCCCAAAAAGGGTTT";
vector<string> res = myslo->findRepeatedDnaSequences(s);
cout<<"*************************************************************"<<endl;
for(auto v:res)
cout<<v<<endl;
cout<<"*************************************************************"<<endl;
//delete myslo;
return 0;
}