虽然做出来了,但是超出时间限制了,就不知道该怎么改进。
超出时间限制如下:
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 对象。例如如下程序:
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