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;
    }
};

 

posted on 2021-10-08 15:43  Yxter  阅读(36)  评论(0编辑  收藏  举报

导航