要求
所有 DNA 都由一系列缩写为 'A','C','G' 和 'T' 的核苷酸组成,例如:"ACGAATTCCG"。在研究 DNA 时,识别 DNA 中的重复序列有时会对研究非常有帮助。
编写一个函数来找出所有目标子串,目标子串的长度为 10,且在 DNA 字符串 s 中出现次数超过一次。
示例 1:
输入:s = "AAAAACCCCCAAAAACCCCCCAAAAAGGGTTT"
输出:["AAAAACCCCC","CCCCCAAAAA"]
示例 2:
输入:s = "AAAAAAAAAAAAA"
输出:["AAAAAAAAAA"]
核心代码
class Solution:
def findRepeatedDnaSequences(self, s: str) -> List[str]:
from collections import defaultdict
n = len(s)
lookup = defaultdict(int)
for i in range(0,n-9):
lookup[s[i:i+10]] += 1
return [key for key,value in lookup.items() if value > 1]
另一解法
class Solution:
def findRepeatedDnaSequences(self, s: str) -> List[str]:
repeatset = set()
res = set()
for i in range(0,len(s)-9):
if s[i:i+10] in repeatset:
res.add(s[i:i+10])
else:
repeatset.add(s[i:i+10])
return list(res)
解题思路:第一种解法:我们对字符串进行线性遍历,从第一个字符开始,每次取出10个字符组成字符串,放到一个字典中,最后看这个字典中的值超过1个的,输出到答案中,时间复杂度O(n),空间复杂度O(n)。第二种解法:我们使用两个集合,当在repeatset中存在的话,在次扫描到,次数就会超过两次,加入到我们的答案列表中,输出即可。