2016-10-27 4 views
0

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

Моя основная идея узнана из ответа Юлианы здесь (Check if string is repetition of an unknown substring), я переписываю алгоритм в Python 2.7.

Я думаю, что это должно быть O(n^2), но не уверен, что я прав, вот моя мысль - так как во внешнем цикле он пытается запустить символ начала итерации с помощью - это O(n) внешний цикл, а в внутренний цикл, он сравнивает характер один за другим - это O(n) внутреннее сравнение. Итак, общая временная сложность - O(n^2)? Если я не прав, пожалуйста, помогите исправить. Если я прав, пожалуйста, помогите подтвердить. :)

Входной и выходной пример

catcatcat => 3 
aaaaaa=>1 
aaaaaba = > 7 

Мой код,

def rorate_solution(word): 
    for i in range(1, len(word)//2 + 1): 
     j = i 
     k = 0 
     while k < len(word): 
      if word[j] != word[k]: 
       break 
      j+=1 
      if j == len(word): 
       j = 0 
      k+=1 
     else: 
      return i 

    return len(word) 

if __name__ == "__main__": 
    print rorate_solution('catcatcat') 
    print rorate_solution('catcatcatdog') 
    print rorate_solution('abaaba') 
    print rorate_solution('aaaaab') 
    print rorate_solution('aaaaaa') 
+1

('rorate' не звонит слишком много звонков - рассмотрите _shift_.) Что касается анализа временной сложности, укажите, рассматриваете ли вы сложность представленного алгоритма/_procedure_ или проблему (самый быстрый алгоритм). – greybeard

+1

(Название этого сообщения ужасно. Я сожалею, что не нашел «официального» имени для (участников) этой проблемы. _Periodic string_, похоже, является установленным термином для строк, которые являются повторениями одной меньшей строки (Я называю это _base_ для этого комментария), но даже значение _period_ в этом контексте, по-видимому, отличается между количеством повторений (не обязательно наибольшим) и повторяющейся строкой (не обязательно кратчайшей). Я даже не уверен все согласны с тем, что строка обязательно начинается и заканчивается _base_. Еще одна строка diction string a _power_ of _base_. – greybeard

+1

Разве это не дубликат с http://stackoverflow.com/questions/6021274/finding-shortest-repeating-cycle- in-word? –

ответ

1

Ваша оценка выполнения вашей повторной записи правильно.


Но Use just the preprocessing of KMP to find the shortest period of a string.


(Повторная запись может быть более простым:

def shortestPeriod(word): 
    """the length of the shortest prefix p of word 
    such that word is a repetition p 
    """ 
# try prefixes of increasing length 
    for i in xrange(1, len(word)//2 + 1): 
     j = i 
     while word[j] == word[j-i]: 
      j += 1 
      if len(word) <= j: 
       return i 

    return len(word) 

if __name__ == "__main__": 
    for word in ('catcatcat', 'catcatcatdog', 
       'abaaba', 'ababbbababbbababbbababbb', 
       'aaaaab', 'aaaaaa'): 
     print shortestBase(word) 

- ваш сравнивает word[0:i] с word[i:2*i] два раза подряд.)

+0

Спасибо greybeard, прочитайте код алгоритма KMP и путайте эту строку 'smallPieceLen = len (inputv) - nxt [-1]', и 'nxt [-1]' означает, что вся строка не соответствует, какой индекс мы будем использовать для сравнения следующего. 'smallPieceLen' представляет собой разницу в общей длине строки и' nxt [-1] ', как ее можно представить как кратчайшую повторяющуюся строку? –

+0

Привет, Greybeard, я прочитал алгоритм, который вы назвали, кажется отличным от KMP, https: //en.wikipedia.org/wiki/Knuth% E2% 80% 93Morris% E2% 80% 93Pratt_algorithm, KMP первые два элемента таблицы должны быть '-1' и' 0', но вы указали post, начальные элементы - '0'. –

+1

(Просто добавил комментарий, в котором имена переменных находятся в контексте. Хотели бы вы поверить, что кто-то еще прокомментировал описание KMP на en.wikipedia на сообщение некоторым Линем Ма всего год назад в CR?) – greybeard