leetcode每日一题系列- 重复的DNA序列-「滑动窗口」

388 阅读1分钟

leetcode-187-重复的DNA序列

[博客链接]

菜🐔的学习之路

掘金首页

[题目链接]

题目链接

[github地址]

github地址

所有 DNA 都由一系列缩写为 'A','C','G' 和 'T' 的核苷酸组成,例如:"ACGAATTCCG"。在研究 DNA 时,识别 DNA 中的重复序列有时会对研究非常有帮助。

编写一个函数来找出所有目标子串,目标子串的长度为 10,且在 DNA 字符串 s 中出现次数超过一次。

 

示例 1:

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

示例 2:

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

提示:

  • 0 <= s.length <= 105
  • s[i] 为 'A'、'C'、'G' 或 'T'

思路一:滑动窗口

  • 许久未见的滑动窗口
  • 每一次记录当前固定长度的字符串
  • 通过map记录每个字符串的数量
  • 当数量==1的时候,存入结果集
public List<String> findRepeatedDnaSequences(String s) {
    List<String> res = new ArrayList<>();
    int n = s.length();
    Map<String, Integer> map = new HashMap<>();
    for (int i = 0; i <= n - 10; i++) {
        int cnt = map.getOrDefault(s.substring(i, i + 10), 0);

        if (cnt == 1) {
            res.add(s.substring(i, i + 10));
        }
         map.put(s.substring(i, i + 10), cnt + 1);

    }
    return res;
}
  • 时间复杂度O(n)
  • 空间复杂度O(n)