所有 DNA 都由一系列缩写为 A,C,G 和 T 的核苷酸组成,例如:“ACGAATTCCG”。在研究 DNA 时,识别 DNA 中的重复序列有时会对研究非常有帮助。
编写一个函数来查找目标子串,目标子串的长度为 10,且在 DNA 字符串 s
中出现次数超过一次。
示例:
输入:s = "AAAAACCCCCAAAAACCCCCCAAAAAGGGTTT" 输出:["AAAAACCCCC", "CCCCCAAAAA"]
思考
1.通用的解法是,设置一个map,用子字符串当key, 次数当value,然后遍历原字符串。
注意最后一个 i + 10 = s.length, i到i+9是最后一个子串。
代码实现
/**
* @param {string} s
* @return {string[]}
*/
var findRepeatedDnaSequences = function(s) {
const map = new Map()
const result = []
//注意最后一个i的位置[i,i+9]是字符串,i+10正好等于s的长度
for(let i = 0; i + 10 <= s.length; i++) {
let dna = s.substring(i,i+10)
//没有的话,就加入map
if (!map.has(dna)) {
map.set(dna, 1)
}else if(map.get(dna) === 1) {
//有一个,就说明重复了,设为2,加到结果里
result.push(dna)
map.set(dna, 2)
}else {
//大于1个,那就值+1
map.set(dna, map.get(dna)+1)
}
}
return result
};
解法2
可以用两个集合。第一个集合记录出现过的字符串。第二个集合记录结果。
如果字符串在第一个集合里存在,说明他已经出现过了,就添加的result集合。
因为集合的属性,重复添加,result里面的元素还是具有唯一性的。
最后将result变成数组返回。
/**
* @param {string} s
* @return {string[]}
*/
var findRepeatedDnaSequences = function(s) {
//set记录出现过没
const set = new Set()
//result记录超过一次的字符串
const result = new Set()
for(let i = 0; i+10 <= s.length; i++) {
dna = s.substring(i,i+10)
if (set.has(dna)) {
result.add(dna)
}else {
set.add(dna)
}
}
return Array.from(result)
};