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

news2024/11/28 6:32:10

文章目录

  • 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.coloradmin.cn/o/1172614.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android Gldie复用只取之前decode过的缓存resource,Kotlin

Android Gldie复用只取之前decode过的缓存resource&#xff0c;Kotlin import android.graphics.Bitmap import android.os.Bundle import android.util.Log import android.widget.ImageView import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.life…

数据可视化:地图

1.基础地图的使用 如何添加颜色表示层级 代码实现 """基础地图的使用 """ from pyecharts.charts import Map from pyecharts.options import VisualMapOpts# 准备地图对象 map Map() # 准备数据 data [("北京市", 9),("上海市…

【漏洞复现】Apache_HTTP_2.4.49_路径穿越漏洞(CVE-2021-41773)

感谢互联网提供分享知识与智慧&#xff0c;在法治的社会里&#xff0c;请遵守有关法律法规 文章目录 1.1、漏洞描述1.2、漏洞等级1.3、影响版本1.4、漏洞复现1、基础环境2、漏洞验证方式一 curl方式二 bp抓包 说明内容漏洞编号CVE-2021-41773漏洞名称Apache HTTP 路径穿越漏洞漏…

Transformer:开源机器学习项目,上千种预训练模型 | 开源日报 No.66

huggingface/transformers Stars: 113.5k License: Apache-2.0 这个项目是一个名为 Transformers 的开源机器学习项目&#xff0c;它提供了数千种预训练模型&#xff0c;用于在文本、视觉和音频等不同领域执行任务。该项目主要功能包括&#xff1a; 文本处理&#xff1a;支持…

YOLOv5源码中的参数超详细解析(5)— 验证部分(val.py)参数解析

前言:Hello大家好,我是小哥谈。YOLOv5是一种先进的目标检测算法,它可以实现快速和准确的目标检测。在YOLOv5源码中,train.py和detect.py文件讲完了之后,接着就是讲val.py文件了。本节课就结合源码对val.py文件进行逐行解析~!🌈 前期回顾: YOLOv5源码中的参数超详细解…

对Java的多线程的理解

说说对Java线程的理解 下面是AI的回答 Java线程就是Java程序里面可以同时运行多个任务。Java提供了几种创建和管理线程的方式&#xff0c;其中一种是继承Thread类&#xff0c;另一种是实现Runnable接口或Callable接口。jdk5提供了线程池&#xff0c;可以更方便地创建、启动和终…

3BHE022291R0101 PCD230A 专注于制造卓越人工智能

3BHE022291R0101 PCD230A 专注于制造卓越人工智能 BISTelligence是BISTel的一个分支&#xff0c;BISTel是为全球半导体和FPD制造商提供工程和软件自动化产品的领先供应商。半导体产品集团上个月被卖给了新思科技。在出售给Synopsys之后&#xff0c;Bisetlliegnce成立了两个部门…

面试—如何介绍项目中的多级缓存?

项目中使用的多级缓存也就是 分布式缓存 Redis 本地缓存 Caffeine&#xff0c;那么令 Caffeine 作为一级缓存&#xff0c;Redis 作为二级缓存&#xff0c;在项目中通过记录数据的访问次数&#xff0c;将热点数据放在 本地缓存&#xff0c;将非热点数据放在 Redis缓存 中&#…

生成式人工智能:网络攻击者手中的破坏性力量

2022 年底&#xff0c;公开可用的生成式人工智能工具的推出使我们进入了人类历史上最大的技术革命之一。 一些人声称它的影响与互联网、手机、智能手机和社交媒体的引入一样大&#xff0c;甚至更大。这些新的生成式人工智能技术的采用和发展速度是我们以前从未见过的。 虽然这…

【实战Flask API项目指南】之四 请求和响应处理

实战Flask API项目指南之 请求和响应处理 本系列文章将带你深入探索实战Flask API项目指南&#xff0c;通过跟随小菜的学习之旅&#xff0c;你将逐步掌握 Flask 在实际项目中的应用。让我们一起踏上这个精彩的学习之旅吧&#xff01; 前言 当小菜踏入Flask后端开发的世界时&…

实证论文复刻|stata安慰剂检验

文章及代码来源&#xff1a;中国工业经济《税收征管数字化与企业内部薪酬差距》 目录 随机抽取对照组和实验组 随机设定政策时点 先po完整代码 *随机抽取对照组和控制组 forvalue i1/500{sysuse 数据1.dta, clear g obs_id _n //初始样本序号gen random_digit runiform() /…

读程序员的制胜技笔记04_有用的反模式(下)

1. 重新发明轮子 1.1. 发明家的特质就是要用质疑的心态对待所有事物&#xff0c;你从未停下质疑&#xff0c;那你将不可避免地成为一个发明家 1.2. 并非所有的事情都有现成的轮子可以拿来用 1.3. 自己重新写一个新的API&#xff0c;最终调用你使用的库 1.3.1. 你的API应该是…

C++二分查找算法的应用:最小好进制

本文涉及的基础知识点 二分查找 题目 以字符串的形式给出 n , 以字符串的形式返回 n 的最小 好进制 。 如果 n 的 k(k>2) 进制数的所有数位全为1&#xff0c;则称 k(k>2) 是 n 的一个 好进制 。 示例 1&#xff1a; 输入&#xff1a;n “13” 输出&#xff1a;“3” …

Canvas制作喷泉效果示例

Canvas能制作出很多动画效果&#xff0c;下面是一个制作喷泉效果的示例 效果图 源代码 <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <meta name"viewport" content"widthdevice-width, initial-scale1 ,user-…

Kubernetes技术与架构-存储 3

如上所示&#xff0c;Kubernetes集群的存储层支持不同类型的存储资源&#xff0c;其提供Projected类型的存储功能整合多种存储资源&#xff0c;将secret、downwardAPI、configMap三种不同类型的存储资源整合成一个挂载到Pod的容器实例中 如上所示&#xff0c;整合两个secret类型…

给跪!我居然被封了!

起因 前两天不知道什么情况&#xff0c;突然收到一条违规信息&#xff0c;说我营销过度&#xff1f;&#xff1f;&#xff1f; 当时一看这个立马有点慌&#xff0c;我的Python爬虫群&#xff0c;付费社群等等不是都受到影响了&#xff1f; 啥我这个号朋友圈啥的都没发&#xff…

ChatGPT 的 Text Completion

该章节我们来学习一下 “Text Completion” &#xff0c;也就是 “文本完成” 。“Text Completion” 并不是一种模型&#xff0c;而是指模型能够根据上下文自动完成缺失的文本部分&#xff0c;生成完整的文本。 ⭐ Text Completion 的介绍 Text Completion 也称为文本自动补全…

项目管理之如何估算项目工作成本

在项目管理中&#xff0c;如何估算项目工作成本是一个关键问题。为了解决这个问题&#xff0c;我们可以采用自上而下的成本限额估算法和自下而上的成本汇总估算法。这两种方法各有优缺点&#xff0c;但都可以帮助我们准确地估算项目工作成本。 自上而下的成本限额估算法 自上…

运维知识点-Docker从小白到入土

Docker从小白到入土 安装问题-有podmanCentos8使用yum install docker -y时&#xff0c;默认安装的是podman-docker软件 安装docker启动dockeryum list installed | grep dockeryum -y remove xxxx安装Docker安装配置下载安装docker启动docker&#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…