码迷,mamicode.com
首页 > 其他好文 > 详细

【leetcode】Repeated DNA Sequences(middle)★

时间:2015-03-05 12:12:07      阅读:146      评论:0      收藏:0      [点我收藏+]

标签:

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++) //遍历所有起始位置
        {
            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;
    }

 

【leetcode】Repeated DNA Sequences(middle)★

标签:

原文地址:http://www.cnblogs.com/dplearning/p/4315197.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!