小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
说明:文章部分内容及图片出自网络,如有侵权请与我本人联系(主页有公众号:小攻城狮学前端)
作者:小只前端攻城狮、 主页:小只前端攻城狮的主页、 来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
题目描述
所有 DNA 都由一系列缩写为
'A','C','G'和'T'的核苷酸组成,例如:"ACGAATTCCG"。在研究 DNA 时,识别 DNA 中的重复序列有时会对研究非常有帮助。编写一个函数来找出所有目标子串,目标子串的长度为 10,且在 DNA 字符串
s中出现次数超过一次。
示例1 :
输入:s = "AAAAACCCCCAAAAACCCCCCAAAAAGGGTTT"
输出:["AAAAACCCCC","CCCCCAAAAA"]
示例2 :
输入:s = "AAAAAAAAAAAAA"
输出:["AAAAAAAAAA"]
思路1:Set去重
分析:通过维护一个的滑动窗口,并将窗口中的子串加入Set。返回res去重后的结果。
var findRepeatedDnaSequences = function(s) {
const set = new Set()
const ans = []
const n = s.length
if (n <= 10)
return ans
for (let i = 0; i < n - 9; i++) {
let tmp = s.substring(i, i + 10)
if (set.has(tmp) && !ans.includes(tmp))
ans.push(tmp)
set.add(tmp)
}
return ans
};
思路2:Map版
分析:同set思想,加一个计数。遍历,使用map储存,再判断map里有没有。
var findRepeatedDnaSequences = function(s) {
const L=10;
let map=new Map();
let arr=[]
for(let i=0;i<=s.length-L;i++){
let str=s.slice(i,i+L)
map.set(str,(map.get(str)||0)+1)
}
for(let [value,key] of map){
if(key>1){
arr.push(value)
}
}
return arr;
};
感谢阅读,希望能对你有所帮助,文章若有错误或者侵权,可以在评论区留言或在我的主页添加公众号联系我。
写作不易,如果觉得不错,可以「点赞」+「评论」 谢谢支持❤