187.重复的DNA序列

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值