Repeated DNA Sequences @leetcode
早上到公司第一件事变成了刷leetcode,发现各种题目的各种解法,真心是个挺有趣的过程。比如今天早上碰到的这个DNA序列的问题,一开始完全没有头绪,但是后来看了些文章发现,真的是二进制大法好啊!
会了二进制,走遍天下都不怕啊。
原题如下:
All DNA is composed of a series of nucleotides abbreviated as A, C, G,
and T, for example: “ACGAATTCCG”. When studying DNA, it is sometimes
useful to identify repeated sequences within the DNA.Write a function to find all the 10-letter-long sequences (substrings)
that occur more than once in a DNA molecule.For example,
Given s = “AAAAACCCCCAAAAACCCCCCAAAAAGGGTTT”,
Return: [“AAAAACCCCC”, “CCCCCAAAAA”].
这一题经典的用二进制序列表示字符串序列,以减少内存消耗的例子。
题目中提到DNA序列只包含四种碱基对,分别用A,C,G和T表示,那么就可以用二进制数来分别代表它们:
A:00
C:01
G:10
T:11
那么形如ACGT的DNA序列就可以表示为00011011,也就是27。而且这个值对于所有DNA序列都是唯一的,那么就可以把它作为key,出现的次数作为value,将已出现过的key都放入哈希表中即可。
public class Solution {public List<String> findRepeatedDnaSequences(String s) {List<String> result = new LinkedList<String>();HashMap<Character, Integer> tokenValueMap = new HashMap<Character, Integer>();tokenValueMap.put('A', 0);tokenValueMap.put('C', 1);tokenValueMap.put('G', 2);tokenValueMap.put('T', 3);HashMap<Integer, Integer> sequenceCountMap = new HashMap<Integer, Integer>();int length = s.length();for (int index = 0; index <= length - 10; index++) {int value = 0;for (int i = 0; i < 10; i++) {value <<= 2;value += tokenValueMap.get(s.charAt(index + i));}if (!sequenceCountMap.containsKey(value)) {sequenceCountMap.put(value, 1);} else if (sequenceCountMap.get(value) == 1) {sequenceCountMap.put(value, 2);result.add(s.substring(index, index + 10));}}return result;}
}
上面的java代码可以完美ac,但是大家再看下面这段:
public static List<String> findRepeatedDnaSequences2(String s) {List<String> result = new ArrayList<String>();Map<Character, Integer> tokenValueMap = new HashMap<Character, Integer>();tokenValueMap.put('A', 0);tokenValueMap.put('C', 1);tokenValueMap.put('G', 2);tokenValueMap.put('T', 3);int length = s.length();Map<Integer, Integer> seqMap = new HashMap<Integer, Integer>();for (int i=0; i<=length-10; i++) {int value = 0;for (int j=0; j<10; j++) {value <<= 2;Character c = s.charAt(i+j);Integer tokenValue = tokenValueMap.get(c);value += tokenValue;}if (!seqMap.containsKey(value)) {seqMap.put(value, 1);} else if (seqMap.get(value) == 1) {result.add(s.substring(i,i+10));seqMap.put(value, seqMap.get(value)+1);}}return result;}
这一段代码就有可能报Memory Limit Exceeded
但是如果你多提交几次,你会发现居然有可能AC了。
这完全取决于虚拟机,是否在提交过程中是否有对垃圾进行回收,因为在
for (int j=0; j<10; j++) {value <<= 2;Character c = s.charAt(i+j);Integer tokenValue = tokenValueMap.get(c);value += tokenValue;}
这个for循环中产生了非常多的character对象。
Repeated DNA Sequences @leetcode相关推荐
- 187. Repeated DNA Sequences重复的DNA子串序列
[抄题]: All DNA is composed of a series of nucleotides abbreviated as A, C, G, and T, for example: &qu ...
- LeetCode187—Repeated DNA Sequences
原题 原题链接 All DNA is composed of a series of nucleotides abbreviated as A, C, G, and T, for example: & ...
- 【Lintcode】1335. Repeated DNA Sequences
题目地址: https://www.lintcode.com/problem/1335 给定一个只含 A , C , G , T A,C,G,T A,C,G,T的字符串 s s s,求其所有出现了多次 ...
- Leetcode187-Repeated DNA Sequences
题目描述 所有DNA序列都可以用 A,C,G,T 四个字母表示,比如 "ACGAATTCCG",研究DNA序列时,有时识别重复子串是很有意义的. 请编写一个程序,找到所有长度为10 ...
- 寒假LeetCode打卡
文章目录 @[toc] 链表专题 LeetCode 19. Remove Nth Node From End of List LeetCode 83. Remove Duplicates from S ...
- 暑期LeetCode打卡
文章目录 二分 LeetCode 69. Sqrt(x) LeetCode 35. Search Insert Position LeetCode 34. Find First and Last Po ...
- 如何选择优化算法遗传算法_用遗传算法优化垃圾收集策略
如何选择优化算法遗传算法 Genetic Algorithms are a family of optimisation techniques that loosely resemble evolut ...
- 北国の雪(2018-04-25)
わたしは雪が大好きです. 今北京に一人暮らしです. でも.北京は雪が少ないです. 残念ですね. 時間我ある時.友達と東北に雪と氷を見に行きたい. 我很喜欢雪. 现在自己一个人住在北京. 但是北京很少下 ...
- leetcode 214. Shortest Palindrome | 214. 最短回文串(Java)
题目 https://leetcode.com/problems/shortest-palindrome/ 题解 看了 Related Topics - Rolling Hash 下的相关题目,看到了 ...
最新文章
- Java项目:就业管理系统设计和实现(java+springboot+ssm)
- java基础-迭代器(Iterator)与增强for循环
- Java设计模式-装饰器模式 理论代码相结合
- spring-boot配置readonly
- RabbitMQ入门学习系列(二),单生产者消费者
- spark学习-62-Spark:Yarn-cluster和Yarn-client区别与联系
- xml文件修改逆向android,Android逆向重置版(2)—起源
- PropertyGrid 绑定动态的属性与值的集合
- 《深度学习笔记》——listnumpy索引操作的学习笔记
- linux创建软连接记录
- html网页制作代码大全:庆余年——电影网站7页,不包含js 有登陆注册,表格 table布局 ,有的登录注册页面,内嵌 css
- VAE背后的哲学思想及数学原理
- 人体的神经系统图 分布,人的神经系统分布图
- 小程序_古诗词背诵小程序
- ubuntu 您不是所有者所以您不能更改
- @Primary注解在spring中的使用
- 牛客网——找出直系亲属
- 通信中的MGF(矩生成函数)
- MSP430单片机工程配置driverlib库
- 什么是量子计算机 什么原理,量子计算机原理是什么?