leetcode 187.重复的DNA序列

所有 DNA 都由一系列缩写为 A,C,G 和 T 的核苷酸组成,例如:“ACGAATTCCG”。在研究 DNA 时,识别 DNA 中的重复序列有时会对研究非常有帮助。
编写一个函数来查找 DNA 分子中所有出现超过一次的 10 个字母长的序列(子串)。
 
示例:
输入:s = "AAAAACCCCCAAAAACCCCCCAAAAAGGGTTT"
输出:["AAAAACCCCC", "CCCCCAAAAA"]
来源:力扣(LeetCode)
 
思路:
1、从前往后遍历,每10个字符截取一个字符串(s.substr(i,10) 从i开始拷贝10个字符);
2、建立字符串(键)到整数(值)的映射,截取一个字符串,在map中查找,若有出现,整数值+1,若未出现,设值为1;
3、遍历完成后,利用map容器的迭代器遍历map,所有“值”大于1的“键”存到vector容器中;
4、返回vector容器
 
代码:
 1 //编写一个函数来查找 DNA 分子中所有出现超过一次的 10 个字母长的序列(子串)。
 2 
 3 #include "iostream"
 4 using namespace std;
 5 #include "map"
 6 #include"vector"
 7 
 8 
 9 //枚举思想,建立个10字母长序列到int的映射
10 //用时较长:396ms
11 class Solution
12 {
13 public:
14     vector<string> findRepeatedDnaSequences(string s)
15     {
16         map<string, int> find_map;
17         vector<string> result;
18         string tmp="";
19         for (int i = 0; i < s.length(); i++)
20         {
21             tmp = s.substr(i, 10);
22             if (find_map.find(tmp) != find_map.end())
23             {
24                 find_map[tmp]++;
25             }
26             else
27             {
28                 find_map[tmp] = 1;
29             }
30         }
31         map<string, int>::iterator it;
32         for (it = find_map.begin(); it != find_map.end(); it++)
33         {
34             if (it->second > 1)
35             {
36                 result.push_back(it->first);
37             }
38         }
39         return result;
40     }
41 };
42 
43 //测试
44 int main() {
45 
46     string s = "AAAAACCCCCAAAAACCCCCCAAAAAGGGTTT";
47     Solution s1;
48     vector<string> result = s1.findRepeatedDnaSequences(s);
49     /*for (int i = 0; i < result.size(); i++)
50     {
51         printf("%s\n", result[i].c_str());
52     }*/
53     for (vector<string>::iterator it = result.begin(); it != result.end(); it++)
54     {
55         cout << *it << endl;
56     }
57     system("pause");
58     return 0;
59 }

 

 
posted @ 2020-03-26 09:59  一二三的三二一  阅读(183)  评论(0)    收藏  举报