很重要的一道题

题型适合在面试的时候考

位操作和哈希表结合

public List<String> findRepeatedDnaSequences(String s) {
/*
寻找出现过一次以上的十个字母长的子串
最简单的想法是把每个长度为10的子串存到hashtable中,但是这肯定不符合出题人的意思,要考察位操作
看了答案,使用位操作,第一次做bit manipulation的题
由于A\C\G\T的ASCII码,后三位各不相同,所以我们只要考虑字符的后三位就行
用一个int类型来代表遍历序列,每次把一个字符添加到序列末尾(添加方式是左移3位然后|上下一个字符的后三位)
这样每次用一个掩码提取后27位并|后一位字符代表当前子串,记录到hashtable中,这样用一个int数字代替一个子串,
会节省内存
这里不直接提取后30位的原因是,如果提取30位再向左移3位会超出int范围,而且32位计算机会溢出
所以先提取27位再左移再或
*/
int l = s.length();
List<String> res = new ArrayList<>();
if(l<=10)
{
return res;
}
Map<Integer,Integer> map = new HashMap<>();
//位操作序列
int cur = 0;
//掩码1,用来提取后27位
int mask = 0x7ffffff;
//先把前27位添加上,以后就可以循环实现了 for (int i = 0; i < 9; i++) {
//每次左移3位,空出位置用于添加,&7是提取后三位
cur = (cur<<3)|(s.charAt(i)&7);
}
//开始记录和查询
for (int i = 9; i < l; i++) {
cur = ((cur&mask)<<3)|(s.charAt(i)&7);
map.put(cur,map.getOrDefault(cur,0)+1);
//只在第二次出现时添加,第三次,第四次...不添加
//一开始想着全部添加到map中在遍历key来添加,但是发现那时候就没有字符index:i了,如果用key还原子串很麻烦
if (map.get(cur)==2)
res.add(s.substring(i-9,i+1));
}
return res;
}

[leetcode]187. Repeated DNA Sequences寻找DNA中重复出现的子串的更多相关文章

  1. [LeetCode] 187. Repeated DNA Sequences 解题思路

    All DNA is composed of a series of nucleotides abbreviated as A, C, G, and T, for example: "ACG ...

  2. [LeetCode] 187. Repeated DNA Sequences 求重复的DNA序列

    All DNA is composed of a series of nucleotides abbreviated as A, C, G, and T, for example: "ACG ...

  3. leetcode 187. Repeated DNA Sequences 求重复的DNA串 ---------- java

    All DNA is composed of a series of nucleotides abbreviated as A, C, G, and T, for example: "ACG ...

  4. Java for LeetCode 187 Repeated DNA Sequences

    All DNA is composed of a series of nucleotides abbreviated as A, C, G, and T, for example: "ACG ...

  5. [LeetCode#187]Repeated DNA Sequences

    Problem: All DNA is composed of a series of nucleotides abbreviated as A, C, G, and T, for example: ...

  6. leetcode 26 80 删除已排序数组中重复的数据

    80. Remove Duplicates from Sorted Array II Follow up for "Remove Duplicates":What if dupli ...

  7. LeetCode-Repeated DNA Sequences (位图算法减少内存)

    Repeated DNA Sequences All DNA is composed of a series of nucleotides abbreviated as A, C, G, and T, ...

  8. LeetCode 187. 重复的DNA序列(Repeated DNA Sequences)

    187. 重复的DNA序列 187. Repeated DNA Sequences 题目描述 All DNA is composed of a series of nucleotides abbrev ...

  9. lc面试准备:Repeated DNA Sequences

    1 题目 All DNA is composed of a series of nucleotides abbreviated as A, C, G, and T, for example: &quo ...

随机推荐

  1. 最佳置换算法OPT

    原文链接:https://www.jianshu.com/p/544ee20e307c

  2. 少标签数据学习:宾夕法尼亚大学Learning with Few Labeled Data

    目录 Few-shot image classification Three regimes of image classification Problem formulation A flavor ...

  3. 转:浅谈HTTP中Get、Post、Put与Delete的区别

    1.GET请求会向数据库发索取数据的请求,从而来获取信息,该请求就像数据库的select操作一样,只是用来查询一下数据,不会修改.增加数据,不会影响资源的内容,即该请求不会产生副作用.无论进行多少次操 ...

  4. 第14.17节 爬虫实战3: request+BeautifulSoup实现自动获取本机上网公网地址

    一. 引言 一般情况下,没有特殊要求的客户,宽带服务提供商提供的上网服务,给客户家庭宽带分配的地址都是一个宽带服务提供商的内部服务地址,真正对外访问时通过NAT进行映射到一个公网地址,如果我们想确认自 ...

  5. python zip()函数用法

    zip() --内建函数 zip([iterable, ...]) 它接受一系列可迭代的对象作为参数,将对象中对应的元素打包成一个个tuple(元组),然后返回由这些tuples组成的list(列表) ...

  6. 学习JUC源码(1)——AQS同步队列(源码分析结合图文理解)

    前言 最近结合书籍<Java并发编程艺术>一直在看AQS的源码,发现AQS核心就是:利用内置的FIFO双向队列结构来实现线程排队获取int变量的同步状态,以此奠定了很多并发包中大部分实现基 ...

  7. 【题解】P3629 [APIO2010]巡逻

    link 题意 有 \(n\) 个村庄,编号为 \(1, 2, ..., n\) .有 \(n – 1\) 条道路连接着这些村 庄,从任何一个村庄都可以到达其他任一个村庄.道路长度均为 1. 巡警车每 ...

  8. 【学习笔记】浅析后缀自动机(SAM)及基础应用

    解决子串相关问题的强大工具 我们知道一个长度为 \(n\) 的字符串中所有的子串数目为 \(O(n^2)\) 个,这很大程度上限制了我们对某些子串相关问题的研究.所以有没有解决方案,使得我们可以在可承 ...

  9. 深入理解Java虚拟机(四)——HotSpot垃圾收集器详解

    垃圾收集器 新生代收集器 1.Serial收集器 特点: 单线程工作,收集的时候就会停止其他所有工作线程,用户不可知不可控,会使得用户界面出现停顿. 简单高效,是所有收集器中额外内存消耗最少的. 没有 ...

  10. python程序的三种控制结构

    程序的三种控制结构 什么是控制结构? """ 程序有三种基本结构组成:顺序结构.分支结构.循环结构.任何程序都是由这三种基本结构组成. 顺序结构是程序按照线性顺序依次执行 ...