Я работаю над обучением основам программирования.
Один простой проект - найти индекс повторений подстроки в строке. Так, например, в строке «abcdefdef» и подстроке «def» я хотел бы, чтобы выходные данные были 3 и 6. У меня есть некоторый написанный код, но я не получаю ответы, которые я хочу. Вот что я написал
Примечание : я знаю, что может быть более простой способ получения результата, используя встроенные функции / пакеты языка, такие как регулярные выражения. Я также знаю, что мой подход, вероятно, не оптимальный алгоритм. Тем не менее, в настоящее время я только ищу совет по исправлению следующей логики, а не использую более идиоматические подходы.
import string
def MIT(String, substring): # "String" is the main string I'm searching within
String_list = list(String)
substring_list = list(substring)
i = 0
j = 0
counter = 0
results = []
while i < (len(String)-1):
if [j] == [i]:
j = j + 1
i = i + 1
counter = counter + 1
if counter == len(substring):
results.append([i - len(substring)+1])
counter = 0
j = 0
i = i+1
else:
counter = 0
j = 0
i = i+1
print results
return
Моя аргументация такова. Я превращаю строку и подстроку в список. Это позволяет индексировать каждую букву в строке. Я установил i и j = 0 - это будут мои первые значения в индексе String и substring соответственно. У меня также есть новая переменная counter, которую я установил = 0. По сути, я использую счетчик, чтобы подсчитать, сколько раз буква в позиции [i] равна элементу в позиции [j]. Если counter равен длине подстроки, то я знаю, что [i - len (substring) + 1] - это позиция, с которой начинается моя подстрока, поэтому я добавляю ее в список с именем results. Затем я сбрасываю счетчик и j и продолжаю поиск дополнительных подстрок.
Я знаю, что код неудобен, но я подумал, что все еще смогу получить ответ. Вместо этого я получаю:
>>> MIT("abcdefghi", "def")
[[3]]
>>> MIT("abcdefghi", "efg")
[[3]]
>>> MIT("abcdefghi", "b")
[[1]]
>>> MIT("abcdefghi", "k")
[[1]]
Есть мысли?