描述

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

示例1

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

示例2

输入:
"AAAAAAAAAAA"
复制
返回值:
["AAAAAAAAAA"]
复制
解题思路
1、使用字符串截取函数substr进行逐层截取,当遇到有重复子串时,将重复子串添加到结果串中;
2、这么做会有一个问题,题目要求“返回的所有目标子串的顺序必须与原DNA序列的顺序一致”,判断重复串时该串肯定不是第一次出现,所以不能保证顺序;
3、反过来,从右向左遍历,遍历完后将结果串反转即可得到正确的子串


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