列表

详情


NC220. 重复的DNA序列

描述

所有的 DNA 序列都是由 'A' , ‘C’ , 'G' , 'T' 字符串组成的,例如 'ACTGGGC' 。
请你实现一个函数找出所有的目标子串,目标连续子串的定义是,长度等于 10 ,且在 DNA 序列中出现次数超过 1 次的连续子串(允许两个连续子串有重合的部分,如下面的示例2所示)。
(注:返回的所有目标子串的顺序必须与原DNA序列的顺序一致,如下面的示例1所示
数据范围:DNA序列长度满足 ,保证序列中只出现 'A' , 'C' , 'G' , 'T'。

示例1

输入:

"AAAAACCCCCAAAAACCCCCCAAAAAGGGTTT"

输出:

["AAAAACCCCC","CCCCCAAAAA"]

说明:

"AAAAACCCCC"和"CCCCCAAAAA"长度等于 10 且在DNA序列中分别出现了 2 次。 不能返回["CCCCCAAAAA","AAAAACCCCC"],因为在原DNA序列中,"AAAAACCCCC"要比"CCCCCAAAAA"先出现。

示例2

输入:

"AAAAAAAAAAA"

输出:

["AAAAAAAAAA"]

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 3ms, 内存消耗: 396KB, 提交时间: 2022-05-31

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param DNA string字符串 1
     * @return string字符串vector
     */
    vector<string> repeatedDNA(string DNA) {
        vector<string> res;
        unordered_map<string, int> mp;
        for (int i = 0; i <= DNA.size() - 10; ++i) {
            string tmp = DNA.substr(i, 10);
            mp[tmp]++;
        }
        for (int i = 0; i <= DNA.size() - 10; ++i) {
            string tmp = DNA.substr(i, 10);
            if (mp[tmp] > 1) {
                res.push_back(tmp);
                mp.erase(tmp);
            }
        }
        return res;
        // write code here
    }
};

C++ 解法, 执行用时: 3ms, 内存消耗: 396KB, 提交时间: 2022-05-07

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param DNA string字符串 1
     * @return string字符串vector
     */
    vector<string> repeatedDNA(string DNA) {
        int n = DNA.size();
        if (n <= 10) return {};
        unordered_map<string, int> unmap;
        vector<string> res;
        for (int left = 0; left < n - 9; ++left) {
            string str = DNA.substr(left, 10);
            unmap[str]++;
        }
        for (int left = 0; left < n - 9; ++left) {
            string str = DNA.substr(left, 10);
            if (unmap[str] > 1) {
                res.push_back(str);
                unmap.erase(str);
            }
        }
        return res;
    }
};

C++ 解法, 执行用时: 3ms, 内存消耗: 396KB, 提交时间: 2022-01-06

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param DNA string字符串 1
     * @return string字符串vector
     */
    vector<string> repeatedDNA(string DNA) {
        // write code here
        if(DNA.length() < 11) return {};
        
        unordered_map<string, int> str_i_unmap;
        set<int> i_set;
        for(int i=0,i_end=DNA.length()-9; i<i_end; ++i){
            string str = DNA.substr(i, 10);
            if( str_i_unmap.count(str) ){
                int idx = str_i_unmap[str];
                if( i_set.count(idx) ) ;
                else i_set.insert(idx);
            } else str_i_unmap[str] = i;
        }
        vector<string> res;
        for(int idx : i_set)
            res.push_back( DNA.substr(idx, 10) );
        return res;
    }
};

C++ 解法, 执行用时: 3ms, 内存消耗: 400KB, 提交时间: 2022-03-04

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param DNA string字符串 1
     * @return string字符串vector
     */
    vector<string> repeatedDNA(string DNA) {
        // write code here
       vector<string> res;
        unordered_map<string, int> mp; //使用哈希表统计长度为10的片段出现次数
        for(int i = 0; i <= DNA.size() - 10; i++){ //遍历每个长度为10的片段
            string s = DNA.substr(i, 10);
            mp[s]++; //统计次数
        }
        for(int i = 0; i <= DNA.size() - 10; i++){ //再次遍历每个长度为10的片段,因为输出要按照位置
            string s = DNA.substr(i, 10);
            if(mp[s] > 1){ //遇到出现次数大于1的片段,将其加入输出
                res.push_back(s);
                mp.erase(s); //删去,防止后续再次加入
            }
        }
        return res;
    }
};

C++ 解法, 执行用时: 3ms, 内存消耗: 404KB, 提交时间: 2022-07-31

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param DNA string字符串 1
     * @return string字符串vector
     */
    vector<string> repeatedDNA(string DNA) {
        // write code here
        unordered_map<string, int> mp;
        vector<string> res;
        for(int i = 0; i <= DNA.size() - 10; i++){
            string tmp = DNA.substr(i,10);
            mp[tmp]++;
        }
        for(int i = 0; i <= DNA.size() -10; i++){
            string s = DNA.substr(i,10);
            if(mp[s] > 1){
                res.push_back(s);
                mp.erase(s);
            }
        }
                    return res;

    }
};

上一题