[leetcode]187. Repeated DNA Sequences寻找DNA中重复出现的子串
很重要的一道题
题型适合在面试的时候考
位操作和哈希表结合
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中重复出现的子串的更多相关文章
- [LeetCode] 187. Repeated DNA Sequences 解题思路
		
All DNA is composed of a series of nucleotides abbreviated as A, C, G, and T, for example: "ACG ...
 - [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 ...
 - 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 ...
 - 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 ...
 - [LeetCode#187]Repeated DNA Sequences
		
Problem: All DNA is composed of a series of nucleotides abbreviated as A, C, G, and T, for example: ...
 - leetcode 26 80 删除已排序数组中重复的数据
		
80. Remove Duplicates from Sorted Array II Follow up for "Remove Duplicates":What if dupli ...
 - LeetCode-Repeated DNA Sequences (位图算法减少内存)
		
Repeated DNA Sequences All DNA is composed of a series of nucleotides abbreviated as A, C, G, and T, ...
 - LeetCode 187. 重复的DNA序列(Repeated DNA Sequences)
		
187. 重复的DNA序列 187. Repeated DNA Sequences 题目描述 All DNA is composed of a series of nucleotides abbrev ...
 - lc面试准备:Repeated DNA Sequences
		
1 题目 All DNA is composed of a series of nucleotides abbreviated as A, C, G, and T, for example: &quo ...
 
随机推荐
- 20191012_WMI中可以看到有打印机, 设备管理器中没有
			
开发过程中使用SELECT * FROM Win32_Printer 查看设备有一个备份打印机, 并且被设置为默认打印机了, 但是设备管理器中没有 解决方法: 使用系统自带的测试WMI (Windo ...
 - 第15.39节、splitDockWidget和tabifyDockWidget嵌套布局QDockWidget的PyQt人机对话案例:笨笨机器人
			
专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 一.引言 在第<第三十一章.containers容器类部件QDo ...
 - 第11.27节  Python正则小结:正则静,静则明,明则虚,虚则无为而无不为也
			
正则表达式的章节到此就结束了,老猿现在觉得对我们这些身具程序猿基因特色的人来说,正则表达式应该是蛮可口的开胃小菜. 在写标题时,本来想写"正则表达式小结",后来想了想,百度了一下, ...
 - 第十五章、Model/View架构中Item Views部件的父类
			
老猿Python博文目录 老猿Python博客地址 引言:本章早就写好了,其简版<第15.18节 PyQt(Python+Qt)入门学习:Model/View架构中视图Item Views父类详 ...
 - bugkuctf   这 是 一 个 神 奇 的 登 录 界 面
			
首先结合源码可以看出这是一道sql注入题. 然后开始萌新的日常操作,尝试单引号闭合,可是并没有用,而且因为单引号注入的题太多,导致并没有立刻开始尝试双引号,之后想起双引号(对,双引号木得牌面)得到如下 ...
 - 学习tcp和udp
			
tcp和udp的差别 tcp和udp是不一样的 tcp是一个可靠的连接,如果发出一个tcp请求,那么就一定要回复一个请求 而udp是不需要回复的,就像QQ一样,只要发过来就可以了,不管别人在不在线,发 ...
 - tensorflow 小记——如何对张量做任意行求和,得到新tensor(一种方法:列表生成式)
			
希望实现图片上的功能 import tensorflow as tfa = tf.range(10,dtype=float)b = aa = tf.reshape(a,[-1,1])a = tf.ti ...
 - NET core 添加了新的nuget包,部署出现Could not load file or assembly
			
这个坑,今天整了一天,我添加了Microsoft.AspNetCore.Mvc.Versioning包,结果发布到服务器,我复制了dll过去出现了一直找不到加载不成功的问题 Startup.Confi ...
 - python自带缓存lru_cache用法及扩展(详细)
			
 本篇博客将结合python官方文档和源码详细讲述lru_cache缓存方法是怎么实现, 它与redis缓存的区别是什么, 在使用时碰上functiontools.wrap装饰器时会发生怎样的变化, ...
 - MarkDown的练习_Java开发学习路径
			
MarkDown的练习 语言学习 C/C++语言 Java语言 基础四大件 数据结构与算法 操作系统 计算机网络 设计模式 数据库/SQL 私人令牌:42bb654f53941d5692e98b35f ...