LeetCode - #187 Swift 实现重复的DNA序列

embedded/2025/1/20 6:59:21/

在这里插入图片描述
在这里插入图片描述

网罗开发 (小红书、快手、视频号同名)

  大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等方向。在移动端开发、鸿蒙开发、物联网、嵌入式、云原生、开源等领域有深厚造诣。

图书作者:《ESP32-C3 物联网工程开发实战》
图书作者:《SwiftUI 入门,进阶与实战》
超级个体:COC上海社区主理人
特约讲师:大学讲师,谷歌亚马逊分享嘉宾
科技博主:极星会首批签约作者

文章目录

    • 摘要
    • 描述
    • Swift 题解答案
    • 题解代码分析
    • 示例测试及结果
    • 时间复杂度
    • 空间复杂度
    • 总结

摘要

本文旨在解决一个关于DNA序列中重复子字符串的问题。给定一个DNA序列字符串,要求找出所有长度为10且出现不止一次的子字符串。文章将首先描述问题背景,然后提供Swift语言的解决方案,并详细分析代码、示例测试及结果,最后讨论时间复杂度和空间复杂度。

描述

DNA序列 由一系列核苷酸组成,缩写为 'A', 'C', 'G''T'.。

  • 例如,"ACGAATTCCG" 是一个 DNA序列

在研究 DNA 时,识别 DNA 中的重复序列非常有用。

给定一个表示 DNA序列 的字符串 s ,返回所有在 DNA 分子中出现不止一次的 长度为 10 的序列(子字符串)。你可以按 任意顺序 返回答案。

示例 1:

输入: s = "AAAAACCCCCAAAAACCCCCCAAAAAGGGTTT"
输出: ["AAAAACCCCC","CCCCCAAAAA"]

示例 2:

输入: s = "AAAAAAAAAAAAA"
输出: ["AAAAAAAAAA"]

提示:

  • 0 <= s.length <= 105
  • s[i]``==``'A''C''G' or 'T'

Swift 题解答案

我们可以使用哈希表(字典)来解决这个问题。首先,遍历 DNA 序列字符串,将所有长度为 10 的子字符串作为键存储到哈希表中,并记录每个子字符串出现的次数。然后,遍历哈希表,找出出现次数大于1的子字符串,将它们添加到结果数组中。

题解代码分析

以下是 Swift 语言的解决方案:

import Foundationfunc findRepeatedDnaSequences(s: String) -> [String] {var result = [String]()var substringCounts = [String: Int]()// 如果字符串长度小于10,直接返回空数组if s.count < 10 {return result}// 遍历字符串,统计长度为10的子字符串的出现次数for i in 0..<s.count-9 {let substring = s.substring(with: Range(s.startIndex, offsetBy: i, length: 10))substringCounts[substring, default: 0] += 1}// 找出出现次数大于1的子字符串for (substring, count) in substringCounts {if count > 1 {result.append(substring)}}return result
}// Demo代码模块
let dnaSequence = "AAAAACCCCCAAAAACCCCCCAAAAAGGGTTT"
let repeatedSequences = findRepeatedDnaSequences(s: dnaSequence)
print(repeatedSequences)  // 输出: ["AAAAACCCCC", "CCCCCAAAAA"]

示例测试及结果

  1. 示例1

    • 输入:s = "AAAAACCCCCAAAAACCCCCCAAAAAGGGTTT"
    • 输出:["AAAAACCCCC", "CCCCCAAAAA"]
  2. 示例2

    • 输入:s = "AAAAAAAAAAAAA"
    • 输出:["AAAAAAAAAA"]

时间复杂度

  • 遍历字符串以构建哈希表的时间复杂度为O(n),其中n是字符串的长度。
  • 遍历哈希表以找出重复子字符串的时间复杂度为O(m),其中m是哈希表中不同子字符串的数量,且m <= n/10(因为每个子字符串长度为10)。
  • 因此,总时间复杂度为O(n)。

空间复杂度

  • 哈希表用于存储子字符串及其出现次数,最坏情况下需要存储n/10个不同的子字符串(每个子字符串长度为10)。
  • 因此,空间复杂度为O(n)。

总结

本文介绍了一个关于DNA序列中重复子字符串的问题,并提供了Swift语言的解决方案。通过遍历字符串并使用哈希表统计子字符串的出现次数,我们可以高效地找出所有长度为10且出现不止一次的子字符串。该解决方案的时间复杂度和空间复杂度均为O(n),适用于处理较长的DNA序列字符串。


http://www.ppmy.cn/embedded/155413.html

相关文章

【PHP】双方接口通信校验服务

请求方 使用 ApiAuthService::buildUrl($domain, [terminal > 1, ts > time()]); //http://域名/adminapi/login/platformLogin?signF7FE8A150DEC18BE8A71C5059742C81A&terminal1&ts1736904841接收方 $getParams $this->request->get();$validate ApiA…

信贷业务术语详解:深入理解金融领域的核心概念

信贷&#xff0c;作为金融领域的重要组成部分&#xff0c;是指金融机构&#xff08;如银行、信用合作社等&#xff09;向个人、企业或政府提供资金的过程。这一过程中&#xff0c;金融机构作为资金提供者&#xff0c;借款人则承诺在未来按约定的条件和利率偿还借款。合同明确了…

金融项目实战 07|Python实现接口自动化——连接数据库和数据清洗、测试报告、持续集成

目录 一、投资模块&#xff08;投资接口投资业务&#xff09; 二、连接数据库封装 和 清洗数据 1、连接数据库 2、数据清洗 4、调用 三、批量执行测试用例 并 生成测试报告 四、持续集成 1、代码上传gitee 2、Jenkin持续集成 一、投资模块&#xff08;投资接口投资业务…

2025.1.16——五、LoveSQL1 sqlmap文件类|万能密码

题目来源&#xff1a;BUUCTF [极客大挑战 2019]LoveSQL 1 目录 一、打开靶机&#xff0c;分析信息 二、sqlmap解题——文件类 step 1&#xff1a;通过url进行爆破 step 2&#xff1a;抓包并将信息保存为文件进行爆破数据库 step 3&#xff1a;爆表 step 4&#xff1a;爆…

MATLAB中regexptranslate函数用法

目录 语法 说明 示例 转换特殊字符 对替代文本中的特殊字符进行转义 转换通配符 使用正则表达式替换文本 regexptranslate函数的功能是将文本转换为正则表达式。 语法 newStr regexptranslate(op,str) 说明 newStr regexptranslate(op,str) 会将 str 转换为正则表达…

费解的开关

费解的开关 你玩过“拉灯”游戏吗&#xff1f; 25 盏灯排成一个 55 的方形。 每一个灯都有一个开关&#xff0c;游戏者可以改变它的状态。 每一步&#xff0c;游戏者可以改变某一个灯的状态。 游戏者改变一个灯的状态会产生连锁反应&#xff1a;和这个灯上下左右相邻的灯也…

HTML-BFC+SEO+标签应用实例

文章目录 BFC语义化标签和SEO语义化标签实例页面结构类文本内容类列表类多媒体类特殊功能类 以下是<figure>和<figcaption>标签的一些应用实例&#xff1a;图片展示图表展示代码示例展示引述或诗歌展示数学公式展示多媒体内容展示 以下是<details>和<summ…

element-ui制作多颜色选择器

将颜色存储到一个数组中去。 <template><div class"color-picker-container" style"margin-top: 10px;"><!-- 显示已选颜色 --><div class"color-selection"><divv-for"(color, index) in selectedColors"…