leetcode ——187. 重复的DNA序列

虽然做出来了,但是超出时间限制了,就不知道该怎么改进。

超出时间限制如下:

class Solution:
    def findRepeatedDnaSequences(self, s: str) :
        if len(s) <= 10 :
            return []
        res = []
        i = 0
        while i < len(s)-10:
            #print(s.count(s[i:i+1]))
            if s[i+1:].count(s[i:i+10]) > 0:
                if s[i:i+10] not in res:
                    res.append(s[i:i+10])
                    i += 1
                else:
                    i += 1
            else:
                i += 1
        return res

看了别人的答案做法,,,

解法一:布尔字典:

class Solution:
    def findRepeatedDnaSequences(self, s: str) -> List[str]:
        d = {}
        for i in range(len(s) - 9):
            if s[i: i + 10] in d:
                d[s[i: i + 10]] = True
            else:
                d[s[i: i + 10]] = False
        return [i for i in d if d[i]]
执行用时 :84 ms, 在所有 python3 提交中击败了80.22%的用户
内存消耗 :27.6 MB, 在所有 python3 提交中击败了6.25%的用户

好巧妙啊!!!!!!!

鼓掌!!!!!!!!!!

解法二:计数字典

class Solution:
    def findRepeatedDnaSequences(self, s: str) -> List[str]:
        d = collections.Counter(s[i: i + 10] for i in range(len(s) - 9))
        return filter(lambda i: d[i] > 1, d)
执行用时 :92 ms, 在所有 python3 提交中击败了64.56%的用户
内存消耗 :27.9 MB, 在所有 python3 提交中击败了6.25%的用户
 
关于Counter()的介绍:
collections 包下的 Counter 也是一个很有用的工具类,它可以自动统计容器中各元素出现的次数。

Counter 的本质就是一个特殊的 dict只不过它的 key 都是其所包含的元素而它的 value 则记录了该 key 出现的次数。因此,如果通过 Counter 并不存在的 key 访问 value,将会输出 0(代表该 key 出现了 0 次)。

程序可通过任何可法代对象参数来创建 Counter 对象,此时 Counter 将会自动统计各元素出现的次数,并以元素为 key,出现的次数为 value 来构建 Counter 对象;程序也能以 dict 为参数来构建 Counter 对象;还能通过关键字参数来构建 Counter 对象。例如如下程序:

 

解法三:整型字典

class Solution:
    def findRepeatedDnaSequences(self, s: str) -> List[str]:
        d = collections.defaultdict(int)
        for i in range(len(s) - 9):
            d[s[i: i + 10]] += 1
        return [i for i in d if d[i] > 1]
执行用时 :92 ms, 在所有 python3 提交中击败了64.56%的用户
内存消耗 :27.9 MB, 在所有 python3 提交中击败了6.25%的用户
 
方法四:两个集合,滑动窗口
class Solution:
    def findRepeatedDnaSequences(self, s: str) -> List[str]:
        tmp, ans = set(), set()
        for i in range(len(s) - 9):
            if s[i: i + 10] not in tmp:
                tmp.add(s[i: i + 10])
            elif s[i:i + 10] not in ans:
                ans.add(s[i: i + 10])
        return list(ans)
执行用时 :92 ms, 在所有 python3 提交中击败了64.56%的用户
内存消耗 :27.9 MB, 在所有 python3 提交中击败了6.25%的用户
 
我还差得太远了!!!!继续加油啊!!!!!!
             
                                                                              ——2019.10.21
 

 

posted @ 2019-10-21 17:21  欣姐姐  阅读(158)  评论(0编辑  收藏  举报