Repeated DNA Sequences

原题链接Repeated DNA Sequences

在给定字符串中寻找重复出现的序列,每个序列长度为10

可以采用unordered_map记录每个序列出现的个数,将出现超过一次的添加到结果集中

代码如下

class Solution {
public:vector<string> findRepeatedDnaSequences(string s) {if(s.size() < 10)   return {};vector<string> res;unordered_map<string, int> hash;size_t first = 0;size_t last = 10;while(last <= s.size()){auto str = s.substr(first, last - first);if(hash[str] == 1)res.emplace_back(str);++hash[str];++first;++last;}return res;}
};

但是这种方法每次都需要调用substr获取子串,容易造成性能瓶颈,有什么方法不用调用substr也能判断当前的这个子串出现过呢

由于规定了子串长度为10,而且子串中只能出现”AGCT“四个字符中的一个,那么可以考虑用20个bit来表示长度为10的子串,其中每个字符占两bit。随后采用滑动窗口的思想,新到的字符添加到20bit的低位,溢出的字符丢掉

代码如下

class Solution {
public:vector<string> findRepeatedDnaSequences(string s) {if(s.size() < 10)   return {};vector<string> res;unordered_map<int, int> hash;int val = 0;/* 掩码,用于将左溢出的两位清零 */int mask = (1 << 20) - 1;/* 每个字符占两位,toBit要保证能区分开四个字符 */for(int i = 0; i < 10; ++i)val = (val << 2) | toBit(s[i]);hash[val] = 1;for(int i = 10; i < s.size(); ++i){val = ((val << 2) | toBit(s[i])) & mask;if(hash[val] == 1)res.emplace_back(s.substr(i - 10 + 1, 10));++hash[val];}return res;}
private:int toBit(char ch){switch(ch){case 'A':return 0;case 'G':return 1;case 'C':return 2;case 'T':return 3;}}
};

每天一道LeetCode-----寻找给定字符串中重复出现的子串相关推荐

  1. 【C++leetcode】寻找给定字符串的最大回文子串

    方法一:暴力搜索法 方法简介:从第一个字符开始进行翻转与自己比较如果相等就是回文,依次增加和右移 class Solution {public:string longestPalindrome(str ...

  2. 寻找一个字符串的重复子串 后缀数组

    什么是后缀数组 令字符串 S=S[1]S[2]...S[n]S=S[1]S[2]...S[n]{\displaystyle S=S[1]S[2]...S[n]} , S[i,j]S[i,j]{\dis ...

  3. 字符串的回文子序列个数_计算给定字符串中回文子序列的数量

    字符串的回文子序列个数 Problem statement: 问题陈述: Given a string you have to count the total number of palindromi ...

  4. C#版(击败97.76%的提交) - Leetcode 557. 反转字符串中的单词 III - 题解

    版权声明: 本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. Leetcod ...

  5. 算法设计 - 寻找一个字符串的重复子串LRS

    虽是读书笔记,但是如转载请注明出处 http://segmentfault.com/blog/exploring/ .. 拒绝伸手复制党 问题描述: 首先这是一个单字符串问题.子字符串 R 在字符串 ...

  6. 面试题:寻找一个字符串中出现次数最多的字符以及出现的次数

    要求编写代码实现:寻找一个字符串中出现次数最多的字符以及出现的次数. 解法一:用删除法实现 (挺巧妙的一种) public class FindTheMostAppearChar {public st ...

  7. Leetcode 557 反转字符串中的单词

    Leetcode 557 反转字符串中的单词 题目描述: 给定一个字符串 s ,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序. 示例1: 输入:s = "Let's ...

  8. 经典算法面试题目-设计算法移除字符串中重复的字符(1.3)

    题目 Design an algorithm and write code to remove the duplicate characters in a string without using a ...

  9. 去除字符串中重复字符

    题目http://www.cricode.com/260.html 设计算法并写出代码移除字符串中重复的字符,不能使用额外的缓存空间.注意: 可以使用额外的一个或两个变量,但不允许额外再开一个数组拷贝 ...

最新文章

  1. au加载默认的输入和输出设备失败_Mac OS X的音频输入输出时如何调整音量
  2. 照片墙瀑布流加载与阻止加载
  3. swoole TCP UDP server
  4. matlab r2014a错误,MATLAB中的潜在错误使R2014a回归
  5. 学习 Linux,101: 使用 vi 编辑文件
  6. 机器学习笔记——偏差vs方差
  7. iOS数据持久化 -- Core Data
  8. python执行多个py文件_【经验分享】如何同时运行多个python脚本
  9. web安全day14:扫描与爆破
  10. android looper介绍
  11. 《HBase权威指南》学习总结
  12. C语言读取易语言的字节集,易语言字节集参数传递详解
  13. 服务器远程ghost,神奇Ghost 轻松远程安装软件
  14. 刷机大师独家支持android,刷机大师:独家支持Android L一键刷机
  15. mac下免费svn工具
  16. 【GIS风暴】什么是EPSG?常见坐标系对应的EPSG代号、经度范围、中央经线是多少?
  17. python基础知识-12-模块的了解
  18. 【论文阅读笔记】GPT三部曲
  19. JOYMY九脉换弹电子烟评测
  20. mysql中char是什么意思_mysql中char与varchar的区别

热门文章

  1. Java黑皮书课后题第5章:**5.45(统计:计算平均值和标准方差)在商务应用中……编写一个程序,提示用户输入10个数字,然后运用下面的公式,显示这些数字的平均值以及标准方差
  2. 作业一 郝树伟 1101210664
  3. MySQL索引与Index Condition Pushdown(二)
  4. 分布式监控系统Zabbix3.2添加自动发现磁盘IO并注册监控
  5. 纯java生成excel
  6. 在MAC下搭建JSP开发环境
  7. Ubuntu上的samba共享文件安装配置
  8. UltraEdit常用配置搭建Java/C开发环境
  9. mac java maven 设置
  10. RabbitMQ introduction