#python
#python
Вопрос:
Я пытаюсь закодировать функцию для поиска последней подстроки в строке. Мне не нужно решение в каком-либо другом коде, мне нужно сделать это, используя мою собственную процедуру для домашней работы по курсу.
Большинство тестов работают, хотя при тестировании aa
в aaaaa
происходит сбой. Я понимаю почему, потому что она начинается с позиции, в которой только a
осталось, но как я могу это исправить?
def find_last(s, c):
last_position = 0
result = -1
while True:
next_position = s.find(c, last_position)
if next_position == -1:
break
result = next_position
last_position = next_position len(c)
return result
print(find_last("aaaaa", "aa")) # should output 3 but doesn't?
Комментарии:
1. Мне искренне нравится, что вы не хотите использовать код в качестве ответа на это домашнее задание. Вместо этого я подтолкну вас к нужному. Вы можете попробовать напечатать
aaaaa
строку с конца. Подумайте: индексирование по длине строки, затем медленное построение подстроки с конца и проверка по пути. 😉2. Почему вы не можете просто перевернуть str и сделать то, что вы делаете.
3.
aaaaa
не всегда будет одинаковым, это должно работать для любой строки. Я думаю, @JeromeMontino также подумал, что это было только дляaaaaa
не уверен.4. На самом деле вы можете сделать это для любой строки, а не только
aaaaa
. Если вы не хотите использовать встроенные методы, вы можете либо выполнить реверс, как указал Раман, и проверить из перевернутой версии, ЛИБО обработать индекс строки в обратном направлении, используя его длину в качестве начального индекса и уменьшая и проверяя по пути.5. Возможно, вам захочется прекратить использование
str.find
и заменить его разделением строки и сравнением.
Ответ №1:
Если вам разрешено использовать встроенные функции, вы могли бы сделать это:
idx = s[::-1].find(c[::-1])
return len(s) - (idx len(c)) if idx >= 0 else -1
Ответ №2:
Ваша проблема в этой строке:
last_position = next_position len(c)
Это пропускает потенциальные совпадения. Как бы то ни было, ваш код учитывает только первую, третью и пятую позиции для совпадений. Как вы говорите, правильный ответ приходит при проверке четвертой позиции (index == 3). Но вы пропускаете это, потому что вы каждый раз увеличиваете длину тестовой строки, а не продвигаетесь вперед только на один символ.
Я думаю, вы хотите:
last_position = next_position 1
Ответ №3:
Это потому, что вы увеличиваете next_position на длину найденной подстроки, таким образом пропуская последнее совпадение.
def find_last(s, c):
last_position = 0
result = -1
while True:
next_position = s.find(c, last_position)
if next_position == -1:
break
result = next_position
#last_position = next_position len(c)
last_position = 1
return result
print(find_last("aaaaa", "aa")) # -> 3
Вы также могли бы использовать встроенную функцию python rindex()
, которая вернет первый подсчет индекса с конца строки
print("aaaaa".rindex("aa")) # -> 3