Этот вопрос относится к this problem on lintcode. У меня есть рабочее решение, но для огромного теста требуется слишком много времени. Мне интересно, как это можно улучшить? Возможно, я могу уменьшить количество сравнений, которые я делаю во внешнем цикле.Найти группу строк, которые являются анаграммами
class Solution:
# @param strs: A list of strings
# @return: A list of strings
def anagrams(self, strs):
# write your code here
ret=set()
for i in range(0,len(strs)):
for j in range(i+1,len(strs)):
if i in ret and j in ret:
continue
if Solution.isanagram(strs[i],strs[j]):
ret.add(i)
ret.add(j)
return [strs[i] for i in list(ret)]
@staticmethod
def isanagram(s, t):
if len(s)!=len(t):
return False
chars={}
for i in s:
if i in chars:
chars[i]+=1
else:
chars[i]=1
for i in t:
if i not in chars:
return False
else:
chars[i]-=1
if chars[i]<0:
return False
for i in chars:
if chars[i]!=0:
return False
return True
Update: Просто добавить, не смотря на встроенный вещих решениях, такие как использование Counter
, которые уже оптимизированы. Добавили предложения Майка, но все же превышают лимит времени.
'Мне интересно, как это может быть improved' - пожалуйста, посмотрите на http://codereview.stackexchange.com/ - Ваш вопрос может лучше подходит для нашего сайта-партнера. Пожалуйста, посмотрите на CodeReview, как сначала попросить, чтобы он был хорошо принят. – cel
Ваш метод должен возвращать все строки, которые являются анаграммами любой другой строки? –
Да, правильно, любая пара анаграмм. – Wajahat