leetcode-187-重复的DNA序列
[博客链接]
[题目链接]
[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)