「这是我参与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 <= 105s[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
};
谢谢大家,一起加油