所有 DNA 都由一系列缩写为 A,C,G 和 T 的核苷酸组成,例如:“ACGAATTCCG”。在研究 DNA 时,识别 DNA 中的重复序列有时会对研究非常有帮助。
编写一个函数来查找目标子串,目标子串的长度为 10,且在 DNA 字符串 s 中出现次数超过一次。
示例:
输入:s = “AAAAACCCCCAAAAACCCCCCAAAAAGGGTTT”
输出:[“AAAAACCCCC”, “CCCCCAAAAA”]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/repeated-dna-sequences
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路:
1. 最直接的思路就是将每个长度为10的子序列放入map之中,如果当前重复了,则将其放入结果数组之中,要注意第二次的重复的时候不需要放入结果数组之中;
2. 思路1中有重复的工作,比如在获取长度为10的字串的时候,并不是按照去掉最高位之后添加最低位来实现的,因此时间复杂度有优化的空间,同时如果能够将str映射为数字,也能够将map更改为int类型的数组,从而节约空间复杂度,要实现这个想法,基础是字符串中字符出现的可能性只有四个,从而长度为10的字符串的所有可能性为2^20,能够使用整形数组容纳,所以考虑使用二位二进制来分别表示四个字符,当需要右移的时候,则将当前的二进制数字左移两位,之后和新字符的二进制数组进行或运算,最后使用20位的掩码进行与运算,只保留低位即可。(复杂的点在于二进制与字符串之间的相互转换,但优化效果显著!!!)
class Solution {
public:
vector<string> findRepeatedDnaSequences(string s) {
unordered_map<string,int> smap;
vector<string> ret;
int len = s.size();
if(len<=10)return ret;
string temps = "";
for(int i = 0;i<len-9;i++)
{
temps