2016-12-10 6 views
3

Я ищу функцию в Python, где вы вводите строку в качестве ввода, где определенное слово повторяется несколько раз, пока не достигнет определенной длины.python найти повторную подстроку в строке

Выход будет таким словом. Повторенное слово не обязательно повторяется в целом, и также возможно, что оно не было повторено вообще.

Например:

"pythonpythonp" => "python" 

"hellohello" => "hello" 

"appleapl" => "apple" 

"spoon" => "spoon" 

Может кто-нибудь дать мне несколько советов о том, как написать такую ​​функцию?

+0

Как ваша программа знает, что такое слово? Например, как он узнает, что «яблоко» - это не одно слово? Что относительно слов, которые содержат другие слова? – elethan

+0

Начну с намеков. Если вы все еще застряли, попробовав их, опубликуйте свое попытку, и мы сможем дать вам больше возможностей подумать и попробовать. Вот подсказки. (1) Сначала создайте возможные подстроки, которые вы хотите искать в каждой строке. Есть ли минимальная или максимальная длина? Создайте список или набор подстрок из строки ввода. (2) Когда у вас есть подстроки для поиска, попробуйте идентифицировать уникальные местоположения во входной строке, где появляются подстроки. Это должно заставить вас начать! –

+0

Почему не вывод "pythonpythonp" => "ythonp"? –

ответ

4

Вы можете сделать это, повторяя подстроку определенное количество раз и тестируя, если она равна исходной строке.

Вы должны попробовать это для каждой возможной длины строки, если у вас нет, что сохраняется как переменная

Вот код:

def repeats(string): 
    for x in range(1, len(string)): 
     substring = string[:x] 

     if substring * (len(string)//len(substring))+(substring[:len(string)%len(substring)]) == string: 
      print(substring) 
      return "break" 

    print(string) 

repeats("pythonpytho") 
+0

терпит неудачу с «ложкой». –

+0

Спасибо, что указали, что я исправил ошибку –

0

Start путем создания массива префиксов.

Петля через него в обратном направлении, и остановить первый раз, когда вы найдете то, что повторяется в строке (то есть, она имеет str.count()>1.

Теперь, если же подстрока существует прямо рядом с собой, вы можете вернуть его в качестве слова, которое вы ищете, однако вы должны принять во внимание пример 'appleappl', где предлагаемый алгоритм вернет appl. Для этого, когда вы найдете подстроку, которая существует более одного раза в вашей строке, вы возвращаетесь в результате, подстрока плюс все, что находится между ее следующим появлением, а именно: 'appleappl' вы возвращаете 'appl' +'e' = 'apple'. Если таких строк не найдено, вы возвращаете целое слово, так как нет повторений.

def repeat(s): 
    prefix_array=[] 
    for i in range(len(s)): 
     prefix_array.append(s[:i]) 
    #see what it holds to give you a better picture 
    print prefix_array 

    #stop at 1st element to avoid checking for the ' ' char 
    for i in prefix_array[:1:-1]: 
     if s.count(i) > 1 : 
      #find where the next repetition starts 
      offset = s[len(i):].find(i) 

      return s[:len(i)+offset] 
      break 

    return s 


print repeat(s) 
Смежные вопросы