187. 重复的DNA序列 力扣(中等) 想复杂了,哈希+滑窗
187. 重复的DNA序列
所有 DNA 都由一系列缩写为 'A','C','G' 和 'T' 的核苷酸组成,例如:"ACGAATTCCG"。在研究 DNA 时,识别 DNA 中的重复序列有时会对研究非常有帮助。
编写一个函数来找出所有目标子串,目标子串的长度为 10,且在 DNA 字符串 s 中出现次数超过一次。
示例 1:
输入:s = "AAAAACCCCCAAAAACCCCCCAAAAAGGGTTT"
输出:["AAAAACCCCC","CCCCCAAAAA"]
题解:
学习要点:
string.substr(起始位置,长度);
string.erase(起始位置,结束位置);
代码:TLE代码,复杂了。。。
// TLE class Solution { public: vector<string> findRepeatedDnaSequences(string s) { map<string,int> mp; vector<string> res; int l=s.length(); if(l<=10) return res; int k=0; string s1=""; for(int i=0;i<=l-10;i++) { while(k<10) { s1.push_back(s[i+k]); k++; } if(mp[s1]>0) { s1.erase(s1.begin()); k--; continue;} mp[s1]=1; for(int j=i+1;j<=l-10;j++) { bool flag=1; for(int t=0;t<10;t++) if(s1[t]!=s[j+t]) { flag=0; break;} if(flag) {res.push_back(s1); break;} } s1.erase(s1.begin()); k--; } return res; } };
优化代码:
class Solution { public: vector<string> findRepeatedDnaSequences(string s) { unordered_map<string,int> mp; // 使用map,耗时140ms,使用unordered_map耗时68ms vector<string> res; int l=s.length(); if(l<=10) return res; int k=0; string s1; for(int i=0;i<=l-10;i++) { while(k<10) { s1.push_back(s[i+k]); k++; } // s1 = s.substr(i, 10); // 学习写法 mp[s1]++; if(mp[s1]==2) res.push_back(s1); s1.erase(s1.begin()); k--; } return res; } };