Поиск последней подстроки в строке?

#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