题目

题目来源:力扣(LeetCode

所有 DNA 都由一系列缩写为 ‘A’,’C’,’G’ 和 ‘T’ 的核苷酸组成,例如:”ACGAATTCCG”。在研究 DNA 时,识别 DNA 中的重复序列有时会对研究非常有帮助。
编写一个函数来找出所有目标子串,目标子串的长度为 10,且在 DNA 字符串 s 中出现次数超过一次。

示例 1:

输入:s = “AAAAACCCCCAAAAACCCCCCAAAAAGGGTTT”
输出:[“AAAAACCCCC”,”CCCCCAAAAA”]
示例 2:

输入:s = “AAAAAAAAAAAAA”
输出:[“AAAAAAAAAA”]

思路分析

滑动窗口 + 哈希集合

沿长度为 N 的字符串移动长度为 L 的滑动窗口。检查滑动窗口中的序列是否在 HashSet 中。
如果是,则找到了重复的序列。更新输出。
否则,将序列添加到 HashSet 中。

  1. /**
  2. * @param {string} s
  3. * @return {string[]}
  4. */
  5. var findRepeatedDnaSequences = function (s) {
  6. if (s.length < 11) return [];
  7. let n = s.length, map = new Map(), left = 0, right = 10, res = [];
  8. // 沿长度为 n 的字符串移动长度为 10 的滑动窗口
  9. while (right <= n) {
  10. let cur = s.substring(left, right);
  11. // 检查滑动窗口中的序列是否在 HashSet 中,统计出现的次数,出现次数达到2,就是所求答案
  12. map.set(cur, map.has(cur) ? map.get(cur) + 1 : 1);
  13. left++;
  14. right++;
  15. }
  16. for (let [k, v] of map) {
  17. if (v > 1) res.push(k);
  18. }
  19. return res;
  20. };