🌈【LeetCode - 重复的DNA的序列】- JavaScript =>Set/Map + 去重

128 阅读1分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。


说明:文章部分内容及图片出自网络,如有侵权请与我本人联系(主页有公众号:小攻城狮学前端)

作者:小只前端攻城狮、 主页:小只前端攻城狮的主页、 来源:掘金

GitHub:P-J27、 CSDN:PJ想做前端攻城狮

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


题目描述

所有 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;
};

感谢阅读,希望能对你有所帮助,文章若有错误或者侵权,可以在评论区留言或在我的主页添加公众号联系我。

写作不易,如果觉得不错,可以「点赞」+「评论」 谢谢支持❤