ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

290,重复的DNA序列

2021-06-14 23:02:06  阅读:196  来源: 互联网

标签:10 DNA map int repeated 序列 new 290


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

 

编写一个函数来查找 DNA 分子中所有出现超过一次的10个字母长的序列(子串)。

示例:

输入: s = "AAAAACCCCCAAAAACCCCCCAAAAAGGGTTT"

输出: ["AAAAACCCCC", "CCCCCAAAAA"]

答案:

 1public List<String> findRepeatedDnaSequences(String s) {
2    Set seen = new HashSet();
3    Set repeated = new HashSet();
4    for (int i = 0; i + 9 < s.length(); i++) {
5        String ten = s.substring(i, i + 10);
6        if (!seen.add(ten))
7            repeated.add(ten);
8    }
9    return new ArrayList(repeated);
10}

解析:

意思是每次截取10个字符的子串,并且这种字串出现的次数超过一次,代码很简单,每次截取的时候都会存放到seen集合中,如果存放失败,表示出现了重复,再来看一种写法

 1public List<String> findRepeatedDnaSequences(String s) {
2    Set<Integer> words = new HashSet<>();
3    Set<String> repeated = new HashSet<>();
4    char[] map = new char[26];
5    //map['A' - 'A'] = 0;
6    map['C' - 'A'] = 1;
7    map['G' - 'A'] = 2;
8    map['T' - 'A'] = 3;
9    for (int i = 0; i < s.length() - 9; i++) {
10        int v = 0;
11        for (int j = i; j < i + 10; j++) {
12            v <<= 2;
13            v |= map[s.charAt(j) - 'A'];
14        }
15        if (!words.add(v)) {
16            repeated.add(s.substring(i, i + 10));
17        }
18    }
19    return new ArrayList(repeated);
20}

这种解法和第一种其实原理都是一样的,只不过这里存储的是一个int类型,因为0,1,2,3分别表示的是ACGT,int类型的每两位用来存储ACGT中一个,我们还可以每3位存储,最多也就是30位,小于int类型的32位,就是把下面第12行的v<<=2改为v<<=3。但不能每4位存储,因为这样超过了int的范围。

标签:10,DNA,map,int,repeated,序列,new,290
来源: https://blog.51cto.com/u_4774266/2902577

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有