【每日一题】重复的DNA序列

文章目录

  • Tag
  • 题目来源
  • 题目解读
  • 解题思路
    • 方法一:哈希表
    • 方法二:哈希表+滑动窗口+位运算
  • 写在最后

Tag

【哈希表】【位运算+滑动窗口+哈希表】【字符串】【2023-11-05】


题目来源

187. 重复的DNA序列


题目解读

找出字符串中重复出现的字符串。


解题思路

方法一:哈希表

一种朴素的方法是枚举所有长度为 10 的子字符串,并用哈希表计数,如果该子字符串的出现的次数超过一次,那么该子字符串就是答案要求的重复的 DNA 序列。

实现代码

class Solution {
public:vector<string> findRepeatedDnaSequences(string s) {unordered_map<string, int> cnts;int n = s.size();vector<string> res;for (int i = 0; i <= n - 10; ++i) {string sub = s.substr(i, 10);if (++cnts[sub] == 2) {res.push_back(sub);}}return res;}
};

复杂度分析

时间复杂度: O ( N ⋅ L ) O(N \cdot L) O(NL) N N N 为字符串的 s 的长度, L L L 为固定的字符串的大小。

空间复杂度: O ( N ) O(N) O(N)

方法二:哈希表+滑动窗口+位运算

实际上我们可以使用一个固定大小的滑窗来记录长度为 10 的字符串。题目中已告知我们字符串中的字符种类只有四种,因此可以使用 2 个比特来表示每个字符,于是可以有:

  • A 表示为二进制为 00
  • C 表示为二进制为 01
  • G 表示为二进制为 10
  • T 表示为二进制为 11

这样的话长度为 10 的字符串就可以使用 20 为比特来表示即一个 int 型整数,也就是说滑窗内的字符串可以使用一个 int 型整数表示,这样就降低了时间复杂度。具体地:

  • 先向滑窗中塞进去 9 个字符;
  • 滑窗每向右移动一位,滑窗内就会增加一个字符,滑窗最左侧的字符离开窗口:
    • 滑窗每向右移动一位,滑窗内就会增加一个字符,表示滑窗内字符串的二进制整数值 x = x << 2x = x | bin[ch]bin[ch] 表示字符 ch 对应的二进制;
    • 滑窗左侧的字符离开窗口,x = x & ((1 << 20) - 1),因此时 x22 位比特,我们只需要低 20 位,所以与上 (1 << 20) - 1
  • 剩下就是更新哈希表,一旦有第二次出现的 x,则表示的字符串就是重复的 DNA 序列。

实现代码

class Solution {
public:unordered_map<char, int> bin = {{'A', 0}, {'C', 1}, {'G', 2}, {'T', 3}};vector<string> findRepeatedDnaSequences(string s) {vector<string> res;int n = s.size();if (n <= 10) {return res;}int x = 0;for (int i = 0; i < 9; ++i) {x = (x << 2) | bin[s[i]];}unordered_map<int, int> cnts;for (int i =0; i <= n - 10; ++i) {x = ((x << 2) | bin[s[i + 10 - 1]]) & ((1 << 20) - 1);if (++cnts[x] == 2) {res.push_back(s.substr(i, 10));}}return res;}
};

复杂度分析

时间复杂度: O ( N ) O(N) O(N) N N N 为字符串的 s 的长度, L L L 为固定的字符串的大小。

空间复杂度: O ( N ) O(N) O(N)


写在最后

如果文章内容有任何错误或者您对文章有任何疑问,欢迎私信博主或者在评论区指出 💬💬💬。

如果大家有更优的时间、空间复杂度方法,欢迎评论区交流。

最后,感谢您的阅读,如果感到有所收获的话可以给博主点一个 👍 哦。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/160592.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Nginx+keepalived实现七层的负载均衡

1.keepalived VRRP 介绍 keepalived是什么&#xff1f; keepalived是集群管理中保证集群高可用的一个服务软件&#xff0c;用来防止单点故障。 keepalived工作原理 keepalived是以VRRP协议为实现基础的&#xff0c;VRRP全称Virtual Router Redundancy Protocol&…

c++实现观察者模式

前言 我觉得这是最有意思的模式&#xff0c;其中一个动&#xff0c;另外的自动跟着动。发布-订阅&#xff0c;我觉得很巧妙。 代码 头文件 #pragma once #include<vector> #include<string> #include<iostream>// 抽象观察者 class Aobserver { public:v…

JavaScript设计模式之责任链模式

适用场景&#xff1a;一个完整的流程&#xff0c;中间分成多个环节&#xff0c;各个环节之间存在一定的顺序关系&#xff0c;同时中间的环节的个数不一定&#xff0c;可能添加环节&#xff0c;也可能减少环节&#xff0c;只要保证顺序关系就可以。 如下图&#xff1a; ES5写法…

C++ 多态 纯干货讲解 复制可调试(1)

&#x1f4af; 博客内容&#xff1a;多态 &#x1f600; 作  者&#xff1a;陈大大陈 &#x1f680; 个人简介&#xff1a;一个正在努力学技术的准C后端工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎私信&#xff01; &#x1f496; 欢迎大家&#xff1a;这里是CSD…

UI设计感蓝色商务数据后台网站模板源码

蓝色商务数据后台网站模板是一款适合网站模板下载。提示&#xff1a;本模板调用到谷歌字体库&#xff0c;可能会出现页面打开比较缓慢。 演示下载 qnziyw点cn/wysc/qdmb/20852点html

[概述] 获取点云数据的仪器

这里所说的获取点云的仪器指的是可以获取场景中物体距离信息的相关设备&#xff0c;下面分别从测距原理以及适用场景来进行介绍。 一、三角测距法 三角测距原理 就是利用三角形的几何关系来测量物体的距离。想象一下&#xff0c;你站在一个地方&#xff0c;你的朋友站在另一…

AI:49-基于深度学习的杂草识别

🚀 本文选自专栏:AI领域专栏 从基础到实践,深入了解算法、案例和最新趋势。无论你是初学者还是经验丰富的数据科学家,通过案例和项目实践,掌握核心概念和实用技能。每篇案例都包含代码实例,详细讲解供大家学习。 📌📌📌本专栏包含以下学习方向: 机器学习、深度学…

【小白专用】微信小程序个人中心、我的界面(示例一)23.11.04

微信小程序使用button按钮实现个人中心、我的界面&#xff08;示例一&#xff09; 微信小程序个人中心、我的界面&#xff0c;使用button按钮实现界面布局&#xff0c;更好的将分享好友、获取头像等功能展现出来&#xff0c;更多示例界面&#xff0c;请前往我的主页哦。 1、js…

【腾讯云HAI域探秘】速通腾讯云HAI

速览HAI 产品简介 腾讯云高性能应用服务(Hyper Application lnventor&#xff0c;HA)&#xff0c;是一款面向 Al、科学计算的 GPU 应用服务产品&#xff0c;为开发者量身打造的澎湃算力平台。无需复杂配置&#xff0c;便可享受即开即用的GPU云服务体验。在 HA] 中&#xff0c;…

MySQL 表的增删查改(CRUD)

MySQL 表的增删查改(CRUD) 文章目录 MySQL 表的增删查改(CRUD)1. 新增(Create)2. 查询(Retrieve)2.1 全列查询2.2 指定列查询2.3 查询字段为表达式2.4 别名2.5 去重&#xff1a;DISTINCT2.6 排序&#xff1a;ORDER BY2.7 条件查询2.8 分页查询: LIMIT 3. 修改(Update)4. 删除(D…

【操作系统】多线程同步与互斥

文章目录 一. 实验目的二. 实验内容三. 实验步骤四. 实验结果五. 实验总结 一. 实验目的 &#xff08;1&#xff09;加强对进程同步和互斥的理解&#xff0c;学会使用信号量解决资源共享问题。 &#xff08;2&#xff09;熟悉Linux 进程同步原语。 &#xff08;3&#xff09;掌…

Java web(六):FilterListenerAJAX

文章目录 一、Filter1.1 基本介绍1.2 过滤器的执行流程1.3 拦截路径配置1.4 过滤器链1.5 案例 二、Listener三、AJAX3.1 快速入门3.2 Axios异步框架 四、 JSON4.1 JSON基础语法4.2 Fastjson 五、 案例JSONAxiosServlet Java web的三大组件&#xff1a;Servlet、Filter、Listene…