leetcode 187.重复的DNA序列
所有 DNA 都由一系列缩写为 A,C,G 和 T 的核苷酸组成,例如:“ACGAATTCCG”。在研究 DNA 时,识别 DNA 中的重复序列有时会对研究非常有帮助。
编写一个函数来查找 DNA 分子中所有出现超过一次的 10 个字母长的序列(子串)。
示例:
输入:s = "AAAAACCCCCAAAAACCCCCCAAAAAGGGTTT"
输出:["AAAAACCCCC", "CCCCCAAAAA"]
输出:["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 }

浙公网安备 33010602011771号