Как вывести повторяющиеся части строки Python, а так же ее самую длинную повторяющуюся часть и остальные повторяющиеся части

Рейтинг: -1Ответов: 1Опубликовано: 14.04.2023

Мы хотим вывести повторяющийся кусок входящей на ввод строки (без разделителей).

Например, на ввод берем текст книги повторенный N раз. Нужно найти уникальный кусок текста книги в тексте без повторений.

Исходные данные: 1234123123121211

Результат: 1234 - самые длинные данные 123, 12, 11 - другие повторяющиеся данные

Ответы

▲ 0
  1. считываем несколько символов в piece, их количество задано в repeating_length_min, с 0 индекса строки data

  2. если строка piece есть внутри строки data, то положим ее в лист repeating_pieces

  3. считываем несколько символов в piece, их количество задано в repeating_length_min, с 1 индекса строки data

  4. если строка piece есть внутри строки data, то положим ее в лист repeating_pieces

.... Повторяем эти шаги, пока не дойдем до индекса data[data_len-repeating_length_min-1], этот индекс включается в проверку

  1. считываем несколько символов в piece, их количество задано в repeating_length_min + 1, с 0 индекса строки data

  2. если строка piece есть внутри строки data, то положим ее в лист repeating_pieces

  3. считываем несколько символов в piece, их количество задано в repeating_length_min +1, с 1 индекса строки data

  4. если строка piece есть внутри строки data, то положим ее в лист repeating_pieces

.... Делаем это до тех пор, пока repeating_length_min + N не станет равным data_len

.... Теперь в списке repeating_pieces собраным все повторяющиеся подстроки строки data

  1. сортируем список, что бы наверху (в 0 индексе) были самые длинные строки: repeating_pieces.sort(key=len)

  2. выводим с помощью print в цикле сперва самую длинную строку из списка repeating_pieces

  3. а затем выводим с помощью print в цикле все остальные строки из списка repeating_pieces

Code:

data = input("Введите данные для анализа:\n")
data_len = len(data)
repeating_length_min = input("Задайте минимальную длину строки для анализа совпадений:\n")
repeating_length_min = int(repeating_length_min)
repeating_pieces = []
longest_repeating_piece = ''
piece = ''
index_counter = 0
range_counter = 0

while range_counter != data_len - repeating_length_min:
    while index_counter <= data_len - repeating_length_min:
        for i in range(repeating_length_min + range_counter):
            piece += data[i]
        if piece in data:
            repeating_pieces.append(piece)
        piece = ''
        index_counter += 1
    index_counter = 0
    range_counter += 1

repeating_pieces.sort(key=len)
print(f'\nСамое короткое повторяющееся значение: {repeating_pieces[0]}')
print(f'\nСамое длинное повторяющееся значение: {repeating_pieces[-1]}')
print('\nТоп 10 самых коротких повторяющихся значений:')

for i in range(10):
    print(f'#{i}: {repeating_pieces[i]}')

repeating_pieces.reverse()
print('\nТоп 10 самых длинных повторяющихся значений:')

for i in range(10):
    print(f'#{i}: {repeating_pieces[i]}')