leetcode_187 重复的DNA序列

953 阅读1分钟

要求

所有 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)

image.png

解题思路:第一种解法:我们对字符串进行线性遍历,从第一个字符开始,每次取出10个字符组成字符串,放到一个字典中,最后看这个字典中的值超过1个的,输出到答案中,时间复杂度O(n),空间复杂度O(n)。第二种解法:我们使用两个集合,当在repeatset中存在的话,在次扫描到,次数就会超过两次,加入到我们的答案列表中,输出即可。