• 【leetcode】Repeated DNA Sequences(middle)★


    All DNA is composed of a series of nucleotides abbreviated as A, C, G, and T, for example: "ACGAATTCCG". When studying DNA, it is sometimes useful to identify repeated sequences within the DNA.

    Write a function to find all the 10-letter-long sequences (substrings) that occur more than once in a DNA molecule.

    For example,

    Given s = "AAAAACCCCCAAAAACCCCCCAAAAAGGGTTT",
    
    Return:
    ["AAAAACCCCC", "CCCCCAAAAA"].

    思路:

    开始用hash表存储所有出现过一次的字符串,结果空间超了。 有用最简单的循环,时间又超了。 做不出来,看答案。

    大神的方法,思路是用一个整数来表示一个10字符长的字符串,相当于给字符串编码了。每个字母用一个 2位的二进制数表示 依次把每位对应的数字左移,后面或上新的表示数字。

    //大神的方法 思路是用一个整数来表示一个10字符长的字符串 相当于给字符串编码了
        vector<string> findRepeatedDnaSequences3(string s) {
            unordered_set<int> words;
            vector<string> ans;
            char* map = new char[26];
            map['A' - 'A'] = 0;  //A C G T 分别用二进制数 00 01 10 11表示
            map['C' - 'A'] = 1;
            map['G' - 'A'] = 2;
            map['T' - 'A'] = 3;
    
            for(int i = 0; i + 9 < s.length(); i++) //遍历所有起始位置 注意!!! 必须写成i + 9 < s.length() 不能写成 s.length() - 9, 因为s.length()-9为负数时会被当做是大正数,即并没有用负数来表示。 可能是s.length()是无符号数的原因
            {
                int v = 0;
                for(int j = i; j < i + 10; j++)
                {
                    //对于一个字符串,每一个字母对应一个两位的二进制数 每次把数字左移两位 留出新的空位来放新字母对应的数
                    v <<= 2; 
                    v |= map[s[j] - 'A'];
                }
                //如果数字已经出现过,并且还没有被放入答案中,压入答案
                if(words.find(v) != words.end() && find(ans.begin(), ans.end(), s.substr(i, 10)) == ans.end()) 
                {
                    ans.push_back(s.substr(i, 10));
                }
                else
                {
                    words.insert(v);
                }
            }
    
            return ans;
        }

    我的两个通不过的方法

    //hash表 内存超了
        vector<string> findRepeatedDnaSequences(string s) {
            vector<string> ans;
            unordered_set<string> hash;
            
            if(s.length() < 10) return ans;
    
            for(int i = 0; s.length() - i - 1 >= 10; i++)
            {
                string sub = s.substr(i, 10);
                if(find(ans.begin(), ans.end(), sub) != ans.end())
                {
                    continue;
                }
                if(hash.count(sub) == 0)
                {
                    hash.insert(sub);
                }
                else
                {
                    hash.erase(sub);
                    ans.push_back(sub);
                }
            }
            return ans;
    
        }
    
        //简单的查找法 时间超了
        vector<string> findRepeatedDnaSequences2(string s) {
            vector<string> ans;
            if(s.length() < 10) return ans;
    
            for(int i = 0; s.length() - i - 1 >= 10; i++)
            {
                string sub = s.substr(i, 10);
                if(find(ans.begin(), ans.end(), sub) != ans.end())
                {
                    continue;
                }
                else if(s.find(sub, i + 1) != s.npos)
                {
                    ans.push_back(sub);
                }
            }
    
            return ans;
        }
    
        //大神的方法 思路是用一个整数来表示一个10字符长的字符串 相当于给字符串编码了
        vector<string> findRepeatedDnaSequences3(string s) {
            unordered_set<int> words;
            vector<string> ans;
            char* map = new char[26];
            map['A' - 'A'] = 0;  //A C G T 分别用二进制数 00 01 10 11表示
            map['C' - 'A'] = 1;
            map['G' - 'A'] = 2;
            map['T' - 'A'] = 3;
    
            for(int i = 0; i + 9 < s.length(); i++) //遍历所有起始位置
            {
                int v = 0;
                for(int j = i; j < i + 10; j++)
                {
                    //对于一个字符串,每一个字母对应一个两位的二进制数 每次把数字左移两位 留出新的空位来放新字母对应的数
                    v <<= 2; 
                    v |= map[s[j] - 'A'];
                }
                //如果数字已经出现过,并且还没有被放入答案中,压入答案
                if(words.find(v) != words.end() && find(ans.begin(), ans.end(), s.substr(i, 10)) == ans.end()) 
                {
                    ans.push_back(s.substr(i, 10));
                }
                else
                {
                    words.insert(v);
                }
            }
    
            return ans;
        }
  • 相关阅读:
    js异步编程
    gitreset
    js数据类型
    vuex报错
    个人管理系统综述
    ffmpeg第7篇:数据流选择神器map指令
    eltable多选框根据条件隐藏显示
    [域渗透内网渗透] 从 web 到域控,你未曾设想的攻击链
    宽字节第二期线下培训开始招生啦!!!
    cve20212394 weblogic反序列化漏洞分析
  • 原文地址:https://www.cnblogs.com/dplearning/p/4315197.html
Copyright © 2020-2023  润新知