Мини-урок · перед практикой

Первое и последнее вхождения

Находим крайние вхождения f без циклов.

Как к ней подойти

Потренируйтесь находить нужные символы и фрагменты строки, не теряя границы срезов.

Коротко о теме

У строки есть индексы, срезы и методы поиска. Индексация начинается с нуля, правая граница среза не включается. Перед сборкой ответа проверьте, что произойдёт, если искомый фрагмент отсутствует.

Ключевая идея · find и rfind

Методы возвращают −1 при отсутствии; одинаковые найденные индексы означают одно вхождение.

Проверьте перед запуском

  • При отсутствии f ничего не печатается, даже −1.

Сравните свой подход

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

Ваше принятое решение

Рекомендуемое решение: find и rfind

Методы возвращают −1 при отсутствии; одинаковые найденные индексы означают одно вхождение.

s = input()
first, last = s.find('f'), s.rfind('f')
if first != -1:
    if first == last:
        print(first)
    else:
        print(first, last)

Время: O(L). Память: O(L) для входной строки, O(1) дополнительно.

Другой способ: Подсчёт и поиск с обратной стороны

Индекс первого f в перевёрнутой строке переводим обратно формулой L−1−index. Явные циклы не нужны.

s = input()
count = s.count('f')
if count == 1:
    print(s.index('f'))
elif count > 1:
    print(s.index('f'), len(s) - 1 - s[::-1].index('f'))

Время: O(L). Память: O(L), включая перевёрнутую копию.