所有 DNA 由一系列缩写为 A,C,G 和 T 的核苷酸组成,例如:“ACGAATTCCG”。在研究 DNA 时,识别 DNA 中的重复序列有时会对研究非常有帮助。
编写一个函数来查找 DNA 分子中所有出现超多一次的10个字母长的序列(子串)。
示例:
输入: s = "AAAAACCCCCAAAAACCCCCCAAAAAGGGTTT"
输出: ["AAAAACCCCC", "CCCCCAAAAA"]
第一种思路:
线性扫描一遍S,把所有的长度为10的子串找出来,用hashmap记录出现的次数。
然后输出出现次数 > 1 的子串。
时间复杂度:O(N)
空间复杂度:O(N)
class Solution:
def findRepeatedDnaSequences(self, s):
"""
:type s: str
:rtype: 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]
第二种思路:
也可以用一个集合 repetedString 来记录出现过的 String。
注意也需要用集合来声明 res, 因为结果可能有重复。
时间复杂度:O(N)
空间复杂度:O(N)
class Solution(object):
def findRepeatedDnaSequences(self, s):
"""
:type s: str
:rtype: List[str]
"""
repeatedString = set()
res = set()
for i in range(len(s) - 9):
substring = s[i:i + 10]
if substring in repeatedString:
res.add(substring)
else:
repeatedString.add(substring)
return list(res)