早上到公司第一件事变成了刷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相关推荐

  1. 187. Repeated DNA Sequences重复的DNA子串序列

    [抄题]: All DNA is composed of a series of nucleotides abbreviated as A, C, G, and T, for example: &qu ...

  2. LeetCode187—Repeated DNA Sequences

    原题 原题链接 All DNA is composed of a series of nucleotides abbreviated as A, C, G, and T, for example: & ...

  3. 【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,求其所有出现了多次 ...

  4. Leetcode187-Repeated DNA Sequences

    题目描述 所有DNA序列都可以用 A,C,G,T 四个字母表示,比如 "ACGAATTCCG",研究DNA序列时,有时识别重复子串是很有意义的. 请编写一个程序,找到所有长度为10 ...

  5. 寒假LeetCode打卡

    文章目录 @[toc] 链表专题 LeetCode 19. Remove Nth Node From End of List LeetCode 83. Remove Duplicates from S ...

  6. 暑期LeetCode打卡

    文章目录 二分 LeetCode 69. Sqrt(x) LeetCode 35. Search Insert Position LeetCode 34. Find First and Last Po ...

  7. 如何选择优化算法遗传算法_用遗传算法优化垃圾收集策略

    如何选择优化算法遗传算法 Genetic Algorithms are a family of optimisation techniques that loosely resemble evolut ...

  8. 北国の雪(2018-04-25)

    わたしは雪が大好きです. 今北京に一人暮らしです. でも.北京は雪が少ないです. 残念ですね. 時間我ある時.友達と東北に雪と氷を見に行きたい. 我很喜欢雪. 现在自己一个人住在北京. 但是北京很少下 ...

  9. leetcode 214. Shortest Palindrome | 214. 最短回文串(Java)

    题目 https://leetcode.com/problems/shortest-palindrome/ 题解 看了 Related Topics - Rolling Hash 下的相关题目,看到了 ...

最新文章

  1. Java项目:就业管理系统设计和实现(java+springboot+ssm)
  2. java基础-迭代器(Iterator)与增强for循环
  3. Java设计模式-装饰器模式 理论代码相结合
  4. spring-boot配置readonly
  5. RabbitMQ入门学习系列(二),单生产者消费者
  6. spark学习-62-Spark:Yarn-cluster和Yarn-client区别与联系
  7. xml文件修改逆向android,Android逆向重置版(2)—起源
  8. PropertyGrid 绑定动态的属性与值的集合
  9. 《深度学习笔记》——listnumpy索引操作的学习笔记
  10. linux创建软连接记录
  11. html网页制作代码大全:庆余年——电影网站7页,不包含js 有登陆注册,表格 table布局 ,有的登录注册页面,内嵌 css
  12. VAE背后的哲学思想及数学原理
  13. 人体的神经系统图 分布,人的神经系统分布图
  14. 小程序_古诗词背诵小程序
  15. ubuntu 您不是所有者所以您不能更改
  16. @Primary注解在spring中的使用
  17. 牛客网——找出直系亲属
  18. 通信中的MGF(矩生成函数)
  19. MSP430单片机工程配置driverlib库
  20. 什么是量子计算机 什么原理,量子计算机原理是什么?

热门文章

  1. 菜鸟是如何变成老鸟的?
  2. django管理后台修改管理系统名称和应用名称的方法
  3. 3月22日,30秒知全网,精选7个热点///国内首艘500千瓦氢燃料电池动力船下水​///中航京能光伏REIT正式成立
  4. 华测服务器进不去系统,华测网络数据查询系统
  5. PHP——个人信息管理系统
  6. 不用第三方工具解压缩msi文件提取文件
  7. 西电数字电路与逻辑设计手写笔记
  8. 关于检测数字人脸操纵
  9. 捷配告诉你PCB沉铜电镀板面起泡原因
  10. 怎么处理系统蓝屏后提示代码0x000000d1的错误?