其他分享
首页 > 其他分享> > leetCode_187. 重复的DNA序列

leetCode_187. 重复的DNA序列

作者:互联网

文章目录


前言

看到昨天的大佬们说国庆完了以后的每日一题会变难,把我吓得,结果今天这道题也还好呀!做完了的我来打卡来啦,嘿嘿嘿!那么国庆过后开学的第一天的你或者上班的你有Fighting吗?冲呀!


打卡界面
打卡界面

原题题目

  所有 DNA 都由一系列缩写为 ‘A’,‘C’,‘G’ 和 ‘T’ 的核苷酸组成,例如:“ACGAATTCCG”。在研究 DNA 时,识别 DNA 中的重复序列有时会对研究非常有帮助。
  编写一个函数来找出所有目标子串,目标子串的长度为 10,且在 DNA 字符串 s 中出现次数超过一次。

原题案例

案例截图

题目分析

今天的这道题,我开始看到的时候其实是有一点点懵的,因为我不是很清楚DNA是什么,我第一遍看完题目并不是很通透,但我大概知道它的目的就是要找出连续10个字符连接起来重复出现的数组,于是我的第一反应是和10月三日的小数部分循环一样,但是当时我是通过余数一样时找出来的呀,这个字符串怎们弄呢,我就有头脑一热,用集合,将每10个字符组成的一个字符串保存到集合里面,最后在通过集合内部比较,出现相同的数据就提出来,保存到另一个集合里面,可是这样比较我又觉得太麻烦了,我看了一眼这个题目是一道中等难度的题,那么我如果这样做,我的时间复杂度在80%以上的概率会超过时间限制,于是我想到了用两个HashSet集合保存,因为HashSet集合不会保存相同的元素,所以当第一个集合不保存时,第二个集合就来保存,通过第二个集合的去重后将出现果的数据保存下来,就是我们这道题最终的解法了。

代码展示

public List<String> findRepeatedDnaSequences(String s) {
        List<String> ls = new ArrayList<String>();
        int len = s.length();
        //必须大于10个,等于10个就只出现了一次,返回为空
        if(len <= 10){
            return ls;
        }
        Set<String> set1 = new HashSet<String>();
        Set<String> set2 = new HashSet<String>();
        for(int i = 0; i<=len-10; i++){
            String res = s.substring(i,i+10);
            //由于hashset集合不会重复添加,所以set1集合不会添加重复的元素
            if(!set1.add(res)){
                //当set1添加过后,在利用set2去一次重,不会出现重复的元素
                if(set2.add(res)){
                    //两次筛选过后最后添加元素到我们的集合之中,

标签:10,题目,HashSet,res,187,集合,DNA,leetCode
来源: https://blog.csdn.net/qq_43325476/article/details/120661770