所有 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):
i=0
path=[]
ans=set()
for i in range(len(s)-9):
j=i+10
if s[i:j] not in path:
path.append(s[i:j])
else:
ans.add(s[i:j])
return list(ans)
但是突然想起来在python中,集合的运算速度和效率会远远大于列表
所以,将上面代码中的path改成集合再进行运算,发现神奇的超过了99%,离谱
class Solution:
def findRepeatedDnaSequences(self, s):
i=0
path=set()
ans=set()
for i in range(len(s)-9):
j=i+10
if s[i:j] not in path:
path.add(s[i:j])
else:
ans.add(s[i:j])
return list(ans)
事实证明,学习python基础知识还是很重要的,不然就不会知道Python在集合和列表运算效率上的差异了。