минимальное окно строки, использующее только первое вхождение буквы

#python #python-3.x #window #substring #enumerate

#python #python-3.x #окно #подстрока #перечислять

Вопрос:

проблема заключается в том, что мне нужно найти минимальное окно подстроки в строке, что я могу сделать. прямо сейчас у меня есть это:

 sub = "rth"
str = "zrwhqtho"

first_letter = sub[0]
last_letter = sub[-1]

start = None
end = None

letters = [let for let in str]

for i, letter in enumerate(letters):
    if letter == first_letter:
        start = i
    if letter == last_letter:
        end = i

if start and end:
    print(f"From %s to %s." % (start   1, end   1))
 

он выводит «От 2 до 7». проблема здесь в том, что в основной строке есть 2 буквы h, и программа принимает ту, которая идет после t . как мне сделать так, чтобы она принимала только первое вхождение буквы вместо последней буквы?

Ответ №1:

Прежде всего, вызовите переменную как-то иначе, чем str , поскольку таким образом вы перезаписываете встроенное ключевое слово. Я переименовал его в string .

Обратите внимание, что start and end False if first_letter — это первая буква в string , т.Е. с индексом 0, значение start == 0 == False .

Самое простое решение — использовать встроенную функцию str.find : https://docs.python.org/3/library/stdtypes.html#str.find

 sub = "rth"
string = "zrwhqtho"

first_letter = sub[0]
last_letter = sub[-1]

start = string.find(first_letter)
if start != -1: # string.find returns -1 if first_letter is not found
    end = string.find(last_letter, start)
    # Only checks the string after start, ensures that end > start
else:
    end = -1

if end != -1:
    # End is -1 only if either first_letter is not in the string, or there is no last_letter in the string after first_letter
    print(f"From %s to %s." % (start   1, end   1))