当前位置: 首页 > article >正文

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

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

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

  大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括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 Foundation

func 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.kler.cn/a/511002.html

相关文章:

  • 大数据时代的璀璨明珠:机器学习引领的智能应用革新与深度融合探索
  • 数据结构漫游记:动态实现栈(stack)
  • 天机学堂5-XxlJobRedis
  • HTML应用指南:利用GET请求获取全国特斯拉充电桩位置
  • 多种vue前端框架介绍
  • AV1视频编解码简介、码流结构(OBU)
  • 事务处理系统 (Transaction Processing System, TPS)
  • TCP报文格式与核心机制
  • Pycharm报错:libpng warning: iCCP: known incorrect sRGB profile
  • [手机Linux] 七,NextCloud优化设置
  • 生成模型:生成对抗网络-GAN
  • 数据库高可用方案-07-一致性校验
  • Linux-day06
  • Django SimpleUI 运维系统与云管理平台的常用图标指南
  • git操作(Windows中GitHub)
  • Linux 操作二:文件映射与文件状态
  • 基于Springboot实现旅游网站系统开发
  • CSS笔记01
  • AI 时代的 Prompt 工程入门
  • Redis的安装和配置、基本命令
  • Nginx 集群测试
  • 基于Spring Boot的装饰工程管理系统【附源码】
  • Selenium配合Cookies实现网页免登录
  • (一)afsim第三方库编译
  • 基于IOS快捷指令源码/短信接码分享平台源码 附部署教程
  • Asp .Net Core实现微服务:使用 Nacos 实现配置管理和服务发现