NC220. 重复的DNA序列
描述
示例1
输入:
"AAAAACCCCCAAAAACCCCCCAAAAAGGGTTT"
输出:
["AAAAACCCCC","CCCCCAAAAA"]
说明:
"AAAAACCCCC"和"CCCCCAAAAA"长度等于 10 且在DNA序列中分别出现了 2 次。 不能返回["CCCCCAAAAA","AAAAACCCCC"],因为在原DNA序列中,"AAAAACCCCC"要比"CCCCCAAAAA"先出现。示例2
输入:
"AAAAAAAAAAA"
输出:
["AAAAAAAAAA"]
C++ 解法, 执行用时: 3ms, 内存消耗: 396KB, 提交时间: 2022-05-31
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param DNA string字符串 1 * @return string字符串vector */ vector<string> repeatedDNA(string DNA) { vector<string> res; unordered_map<string, int> mp; for (int i = 0; i <= DNA.size() - 10; ++i) { string tmp = DNA.substr(i, 10); mp[tmp]++; } for (int i = 0; i <= DNA.size() - 10; ++i) { string tmp = DNA.substr(i, 10); if (mp[tmp] > 1) { res.push_back(tmp); mp.erase(tmp); } } return res; // write code here } };
C++ 解法, 执行用时: 3ms, 内存消耗: 396KB, 提交时间: 2022-05-07
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param DNA string字符串 1 * @return string字符串vector */ vector<string> repeatedDNA(string DNA) { int n = DNA.size(); if (n <= 10) return {}; unordered_map<string, int> unmap; vector<string> res; for (int left = 0; left < n - 9; ++left) { string str = DNA.substr(left, 10); unmap[str]++; } for (int left = 0; left < n - 9; ++left) { string str = DNA.substr(left, 10); if (unmap[str] > 1) { res.push_back(str); unmap.erase(str); } } return res; } };
C++ 解法, 执行用时: 3ms, 内存消耗: 396KB, 提交时间: 2022-01-06
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param DNA string字符串 1 * @return string字符串vector */ vector<string> repeatedDNA(string DNA) { // write code here if(DNA.length() < 11) return {}; unordered_map<string, int> str_i_unmap; set<int> i_set; for(int i=0,i_end=DNA.length()-9; i<i_end; ++i){ string str = DNA.substr(i, 10); if( str_i_unmap.count(str) ){ int idx = str_i_unmap[str]; if( i_set.count(idx) ) ; else i_set.insert(idx); } else str_i_unmap[str] = i; } vector<string> res; for(int idx : i_set) res.push_back( DNA.substr(idx, 10) ); return res; } };
C++ 解法, 执行用时: 3ms, 内存消耗: 400KB, 提交时间: 2022-03-04
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param DNA string字符串 1 * @return string字符串vector */ vector<string> repeatedDNA(string DNA) { // write code here vector<string> res; unordered_map<string, int> mp; //使用哈希表统计长度为10的片段出现次数 for(int i = 0; i <= DNA.size() - 10; i++){ //遍历每个长度为10的片段 string s = DNA.substr(i, 10); mp[s]++; //统计次数 } for(int i = 0; i <= DNA.size() - 10; i++){ //再次遍历每个长度为10的片段,因为输出要按照位置 string s = DNA.substr(i, 10); if(mp[s] > 1){ //遇到出现次数大于1的片段,将其加入输出 res.push_back(s); mp.erase(s); //删去,防止后续再次加入 } } return res; } };
C++ 解法, 执行用时: 3ms, 内存消耗: 404KB, 提交时间: 2022-07-31
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param DNA string字符串 1 * @return string字符串vector */ vector<string> repeatedDNA(string DNA) { // write code here unordered_map<string, int> mp; vector<string> res; for(int i = 0; i <= DNA.size() - 10; i++){ string tmp = DNA.substr(i,10); mp[tmp]++; } for(int i = 0; i <= DNA.size() -10; i++){ string s = DNA.substr(i,10); if(mp[s] > 1){ res.push_back(s); mp.erase(s); } } return res; } };