Недавно я пытался решить проблему this problem на Hackerrank. Я закончил с следующим решением, которое дает правильный ответ в течение данного срока:Разница во времени Python
from collections import Counter
lisa=[]
for each in range(input()):
current=raw_input()
count=0
lookup_dict={}
i=0
for i in range(len(current)):
for j in range(i,len(current)):
sub_string=current[i:j+1]
sub_string=''.join(sorted(sub_string))
if sub_string in lookup_dict.keys():
lookup_dict[sub_string]+=1
else:
lookup_dict[sub_string]=1
for k in lookup_dict.values():
count+=k*(k-1)/2
print count
Моя проблема заключается в том, что решение, предоставляемое ими (Приводимые ниже) значительно быстрее, чем я написал, хотя сложности и используемый метод одинаковый.
from collections import *
for i in range(input()):
s = raw_input()
check = defaultdict(int)
l = len(s)
for i in range(l):
for j in range(i+1,l+1):
sub = list(s[i:j])
sub.sort()
sub = "".join(sub)
check[sub]+=1
sum = 0
for i in check:
n = check[i]
sum += (n*(n-1))/2
print sum
Я думаю, что это имеет какое-то отношение к методу defaultdict
, но не могу понять, почему?
Я предполагаю, что проблема заключается в том, что вы повторяете ключи в 'if sub_string в lookup_dict.keys()', что вам не нужно делать в последнем примере, потому что вы используете 'defaultdict' – cnluzon
вы можете попытаться заменить только часть 'defaultdict' и проверить время, затраченное на повторение, также вы вычисляете' len (current) 'на каждом цикле, второй пример кэширует значение, поскольку оно не изменяется. – Hacketo
Чтобы расширить на @ cnluzon's комментарий, попробуйте заменить 'lookup_dict.keys()' только с помощью 'lookup_dict' и посмотреть, как это влияет на вашу скорость. – Kevin