[路飞]_程序员必刷力扣题: 187. 重复的DNA序列

164 阅读2分钟

「这是我参与2022首次更文挑战的第33天,活动详情查看:2022首次更文挑战

187. 重复的DNA序列

DNA序列 由一系列核苷酸组成,缩写为 'A', 'C', 'G' 和 'T'.。

例如,"ACGAATTCCG" 是一个 DNA序列 。 在研究 DNA 时,识别 DNA 中的重复序列非常有用。

给定一个表示 DNA序列 的字符串 s ,返回所有在 DNA 分子中出现不止一次的 长度为 10 的序列(子字符串)。你可以按 任意顺序 返回答案。 示例 1:

输入: s = "AAAAACCCCCAAAAACCCCCCAAAAAGGGTTT"
输出: ["AAAAACCCCC","CCCCCAAAAA"]

示例 2:

入: s = "AAAAAAAAAAAAA"
输出: ["AAAAAAAAAA"]

提示:

  • 0 <= s.length <= 105
  • s[i]``==``'A''C''G' or 'T'

暴力破解

思路

题目中给定一个字符串,返回其中不止一次出现的长度为10的序列,也就是其中某一节长度为10的字符串在改变起点坐标后还能找到,根据示例2我们可以看出,两个相同的序列是可以重复的

那么我们最直接的办法就是可以找到整个字符串中所有长度为10的序列然后进行对比,也就是暴力破解

这里我们通过遍历字符串,找到所有的结果保存在map中,如果某个字符串出现此处大于等于2就是符合条件的

不过这样我们需要再额外遍历一次去寻找长度大于等于2的key

这里我们直接放在一次遍历中,如果长度等于2那么我们才放入结果数组res中,至于会不会出现更多次则无需关系

具体实现:

  • 声明结果数组res和map数据结构用来保存每个字符串出现的次数
  • 遍历字符串,用下标i开始,用slice截取长度为10的子序列,保存在map中,如果出现过那么次数+1否则次数为1
  • 同时判断如果出现次数等于2那么就push到res中

最后返回res即可

var findRepeatedDnaSequences = function (s) {
    // 暴力破解
    var res = []
    var map = new Map()
    for (var i = 0; i < s.length; i++) {
        var item = s.slice(i, i + 10)
        var num = map.get(item)
        map.set(item, num+1||1)
        if (map.get(item)===2) {
            res.push(item)
        }
    }
    return res
};

谢谢大家,一起加油