大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括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:
- 输入:
s = "AAAAACCCCCAAAAACCCCCCAAAAAGGGTTT"
- 输出:
["AAAAACCCCC", "CCCCCAAAAA"]
- 输入:
-
示例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序列字符串。