zoukankan      html  css  js  c++  java
  • 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;
        }
    };
  • 相关阅读:
    TS之类的继承
    TS之函数及函数传参
    TS之数据类型
    Linux 协程
    设计模式 装饰器模式和代理模式
    C/C++ C和C++的区别
    C/C++ 内存分配方式
    Linux 进程间通信
    C/C++ RTTI
    Reactor设计模式
  • 原文地址:https://www.cnblogs.com/stepping/p/15380130.html
Copyright © 2011-2022 走看看