头图

LeetCode-187-重复的DNA序列

重复的DNA序列

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

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

示例说明请见LeetCode官网。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/probl...
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解法一:哈希

首先,判断特殊情况,如果字符串的长度小于11,说明不够组成一个目标子串,不可能有重复的序列,直接返回空。

否则,初始化一个map,用来记录每一个不重复的长度为10的子串,key为子串,value表示相应的key是否是重复序列。然后遍历字符串,每10位作为一个子串,判断当前子串如果不存在,则添加到key中;如果存在且已标为重复,则跳过,如果没有标为重复,则标为重复子串。

最后,返回标为重复的子串即为重复的序列。

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class LeetCode_187 {
    /**
     * 哈希
     *
     * @param s
     * @return
     */
    public static List<String> findRepeatedDnaSequences(String s) {
        // 如果字符串的长度小于11,说明不够组成一个目标子串,不可能有重复的序列,直接返回空
        if (s == null || s.length() < 11) {
            return new ArrayList<>();
        }
        // 记录每一个不重复的长度为10的子串,key为子串,value表示相应的key是否是重复序列
        Map<String, Boolean> map = new HashMap<>();
        // 长度间隔为10,从第一个字符开始
        int startIndex = 0, endIndex = startIndex + 10;
        // 遍历到最后一个字符结束
        while (endIndex <= s.length()) {
            String substring = s.substring(startIndex, endIndex);
            // 如果当前子串不存在,则添加到key中;如果存在且已标为重复,则跳过,如果没有标为重复,则标为重复子串
            if (map.containsKey(substring)) {
                if (!map.get(substring)) {
                    map.put(substring, true);
                }
            } else {
                map.put(substring, false);
            }
            startIndex++;
            endIndex++;
        }
        return map.entrySet().stream().filter(e -> e.getValue()).map(Map.Entry::getKey).collect(Collectors.toList());
    }

    public static void main(String[] args) {
        // 测试用例,期望输出: ["AAAAACCCCC","CCCCCAAAAA"]
        for (String str : findRepeatedDnaSequences("AAAAACCCCCAAAAACCCCCCAAAAAGGGTTT")) {
            System.out.println(str);
        }
    }
}
【每日寄语】 星星之火,可以燎原。

LeetCodet题解
技术学习

玉树临风,仙姿佚貌!

1.8k 声望
7.1k 粉丝
0 条评论
推荐阅读
牛客网高频算法题系列-BM19-寻找峰值
给定一个长度为n的数组nums,请你找到峰值并返回其索引。数组可能包含多个峰值,在这种情况下,返回任何一个所在位置即可。峰值元素是指其值严格大于左右相邻值的元素。严格大于即不能有等于假设 nums[-1] = nums...

雄狮虎豹阅读 507

封面图
Java12的新特性
Java语言特性系列Java5的新特性Java6的新特性Java7的新特性Java8的新特性Java9的新特性Java10的新特性Java11的新特性Java12的新特性Java13的新特性Java14的新特性Java15的新特性Java16的新特性Java17的新特性Java...

codecraft63阅读 11.9k

Java8的新特性
Java语言特性系列Java5的新特性Java6的新特性Java7的新特性Java8的新特性Java9的新特性Java10的新特性Java11的新特性Java12的新特性Java13的新特性Java14的新特性Java15的新特性Java16的新特性Java17的新特性Java...

codecraft32阅读 24.7k评论 1

一文搞懂秒杀系统,欢迎参与开源,提交PR,提高竞争力。早日上岸,升职加薪。
前言秒杀和高并发是面试的高频考点,也是我们做电商项目必知必会的场景。欢迎大家参与我们的开源项目,提交PR,提高竞争力。早日上岸,升职加薪。知识点详解秒杀系统架构图秒杀流程图秒杀系统设计这篇文章一万多...

王中阳Go33阅读 2.6k评论 1

封面图
Java11的新特性
Java语言特性系列Java5的新特性Java6的新特性Java7的新特性Java8的新特性Java9的新特性Java10的新特性Java11的新特性Java12的新特性Java13的新特性Java14的新特性Java15的新特性Java16的新特性Java17的新特性Java...

codecraft28阅读 15.4k评论 3

Java5的新特性
Java语言特性系列Java5的新特性Java6的新特性Java7的新特性Java8的新特性Java9的新特性Java10的新特性Java11的新特性Java12的新特性Java13的新特性Java14的新特性Java15的新特性Java16的新特性Java17的新特性Java...

codecraft13阅读 20.4k

Java9的新特性
Java语言特性系列Java5的新特性Java6的新特性Java7的新特性Java8的新特性Java9的新特性Java10的新特性Java11的新特性Java12的新特性Java13的新特性Java14的新特性Java15的新特性Java16的新特性Java17的新特性Java...

codecraft20阅读 14.5k

玉树临风,仙姿佚貌!

1.8k 声望
7.1k 粉丝
宣传栏