LeetCode——187. 重复的DNA序列(Java)

题目描述

题干:
所有 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是最笨的方法,不过好在测试用例都不是很长,所以还说得过去

当然还有还有采用位运算加滑动窗口加哈希的方法,不过没时间考虑了,应该也是思路相仿

如果文章存在问题或者有更好的题解,欢迎在评论区斧正和评论,各自努力,你我最高处见
posted @ 2021-10-08 09:01  21岁还不是架构师  阅读(83)  评论(0编辑  收藏  举报