2014-12-12 3 views
1

Как говорится в названии, мне нужна помощь, уменьшающая время выполнения кода, который я написал в качестве онлайн-судьи, который я компилирую, дает мне превышение лимита времени, даже несмотря на то, что код кажется, работает и дает правильный ответ, когда я его компилирую.Нужна помощь в сокращении времени выполнения кода на Python

Вопрос:

Сравните список строки и найти число различных последовательностей, где две строки считаются «идентичными» (не отличаются), если они точно так же, или же, но наоборот. Строки содержат только буквы a-z, все строчные буквы и имеют не более 10 символов. Каждый установленный набор будет содержать не более 5000 строк.

Например, строка «abc» идентична «cba», а также «abc». Строка «cba» идентична строке «abc», а также «cba». Список ["abc", "cba," "bac"] имеет две различные строки.

Напишите ответ функции (x), который берет список строк, x, и возвращает количество различных строк, используя это определение одинакового.

Мой код:

def answer(x): 
    b=0 
    ph=[] 
    rand=0 
    for y in x: 
     comp=list(y) 
     ph.append(comp) 
    while b<len(ph)-1: 
     j=b+1 
     while j<len(ph): 

      if(len(ph[b])==len(ph[j])): 
       i=0 

       while(i<len(ph[b])): 

        if ph[b][i]==ph[j][i]: 
         rand+=1 

        elif ph[b][i]==ph[j][len(ph[b])-1-i]: 
         rand+=1 
         i+=1 
       if rand==len(ph[b]): 
        ph.pop(j) 
       rand=0 
      j+=1 
     b+=1 

    return len(ph) 
+0

Этот вопрос может быть более подходящим для StackOverflow чем Просмотр Кода, вы можете получить лучшую помощь там –

+0

Ваш код не на самом деле работает. Ну, технически, он переходит в бесконечный цикл. – jgritty

ответ

2

Не нужно делать серийные сравнения символов для проверки строки идентичности.

Строки неизменны в Python. Просто поместите строку и ее обратную ссылку в словарь, а затем всегда проверяйте этот словарь.

def answer(x): 
    seen = {} 
    count = 0 
    for s in x: 
     if s not in seen: 
      seen[s] = True 
      seen[s[::-1]] = True 
      count +=1 
    return count 
0

Это может быть непосредственно сделано с set() функции с минимальным возможным временем, но это будет только удалить точно такие же строки. Таким образом, для удаления перевернутых строк также требуется цикл, но до того, как аналогичные строки (не обратные) будут отфильтрованы с использованием set(), что сильно уменьшит итерации цикла.

>>> def getUnique(st): 
... st = set(st) 
... unique = set() 
... for x in st: 
...  if x[::-1] not in unique: 
...   unique.add(x) 
... return list(unique) 
... 
>>> strings = ['abc','def','ghi','abc','cba','ihg','jkl','lkj','the'] 
>>> getUnique(strings) 
set(['the', 'abc', 'lkj', 'ihg', 'def']) 
Смежные вопросы