LeetCode算法学习之- 滑动窗口-[187] 重复的DNA序列

59 阅读1分钟

题目

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

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

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

分析

  1. String 字符串 可进行迭代
  2. 固定尺寸为10的子字符串

解法:双指针


思路
1.固定size的滑动窗口
2.hash值记录出现频次
3.取出频次大于1的元素则为答案

// @lc code=start
/**
 * @param {string} s
 * @return {string[]}
 */
var findRepeatedDnaSequences = function (s) {
  if (s.length < 10) return [];
  const res = {};

//   迭代 
  for (let i = 0; i <= s.length - 10; i++) {
    // 构建固定的滑动窗口
    const str = s.substring(i, i + 10);
    // 使用hash来记录值
    res[str] ? (res[str] = res[str] + 1) : (res[str] = 1);
  }
  const arr = [];
//   寻找符合答案的值
  Object.keys(res).forEach((key) => {
    if (res[key] > 1) {
      arr.push(key);
    }
  });

  return arr;
};

//时间复杂度:O(nl) l为滑动窗口的size 
//空间复杂度:O(nl)


总结

今天这道题是主要是练习如何使用基本的固定尺寸的滑动窗口

大家可以看看我分享的一个专栏(前端搞算法)里面有更多关于算法的题目的分享,希望能够帮到大家,我会尽量保持每天晚上更新,如果喜欢的麻烦帮我点个赞,十分感谢

大家如果对“TS”感兴趣的可以看看我的专栏 (TypeScript常用知识),感谢大家的支持

文章内容目的在于学习讨论与分享学习算法过程中的心得体会,文中部分素材来源网络,如有侵权,请联系删除,邮箱 182450609@qq.com

\