题目
所有 DNA 都由一系列缩写为 'A','C','G'
和 'T'
的核苷酸组成,例如:"ACGAATTCCG"
。在研究 DNA
时,识别 DNA
中的重复序列有时会对研究非常有帮助。
编写一个函数来找出所有目标子串,目标子串的长度为 10,且在 DNA 字符串 s 中出现次数超过一次。
示例 1:
输入:s = "AAAAACCCCCAAAAACCCCCCAAAAAGGGTTT" 输出:["AAAAACCCCC","CCCCCAAAAA"]
示例 2:
输入:s = "AAAAAAAAAAAAA" 输出:["AAAAAAAAAA"]
解题
方法一:哈希表
- 先用哈希表,记录每个长度为10的字符串出现次数
- 对出现次数大大于1的,记录下来
class Solution { public: vector<string> findRepeatedDnaSequences(string s) { vector<string> res; unordered_map<string,int> map; for(int i=0;i<=int(s.size())-10;i++){//注意等号,举个例子就知道了 string str=s.substr(i,10); map[str]++; } for(const pair<string,int> &it:map){ if(it.second>=2){ res.push_back(it.first); } } return res; } };
注意点1:
注意:s.size()的返回值类型为std::size_t 类型,通常是 unsigned int 或 unsigned long 或 unsigned long long,
如果值为-1就会被强制转为该类型的最大值,于是比较的结果不符合预期。比如a.size()是1, 减去10后会变成-9,由于是size_t类型,自动会转为很大的一个数,不符合预期。
举个例子
所以解决办法
- 在a.size()外面套一个int,先转为int
- 在使用a.size() 前, 先定义int n=a.size(); 将它转为int
- 保证 a.size()-10>0
注意点2:
另外unordered_map中的值是不可以改变的,
因此const pair &it:map
,如果加了&取值符号,就一定要加const
或者拷贝一份pair it:map
再或者 直接 auto& it:map;