题目描述
题干:
所有 DNA 都由一系列缩写为 'A','C','G' 和 'T' 的核苷酸组成
例如:"ACGAATTCCG"。在研究 DNA 时,识别 DNA 中的重复序列有时会对研究非常有帮助。
编写一个函数来找出所有目标子串,目标子串的长度为 10,且在 DNA 字符串 s 中出现次数超过一次。
示例 1:
输入:s = "AAAAACCCCCAAAAACCCCCCAAAAAGGGTTT"
输出:["AAAAACCCCC","CCCCCAAAAA"]
示例 2:
输入:s = "AAAAAAAAAAAAA"
输出:["AAAAAAAAAA"]
题解思路
返回出现次数超过一次的长度为10的子串,最简单的把每个连续长度为10的子串统计
如果出现一次以上就返回到List中去,但是注意不要重复多次保存结果
正确代码
static final int L = 10;
public List<String> findRepeatedDnaSequences(String s) {
List<String> ans = new ArrayList<>();
Map<String, Integer> cnt = new HashMap<>();
int n = s.length();
for (int i = 0; i <= n - L; i++) {
String sub = s.substring(i, i + L);
cnt.put(sub, cnt.getOrDefault(sub, 0) + 1);
if (cnt.get(sub) == 2) {
ans.add(sub);
}
}
return ans;
}
总结
显然substr和hash是最笨的方法,不过好在测试用例都不是很长,所以还说得过去
当然还有还有采用位运算加滑动窗口加哈希的方法,不过没时间考虑了,应该也是思路相仿
如果文章存在问题或者有更好的题解,欢迎在评论区斧正和评论,各自努力,你我最高处见