Всегда есть эта ошибка 'IndexError: индекс строки вне диапазона', когда я принял во внимание диапазон индекса - PullRequest
3 голосов
/ 20 июня 2020

Необходимо написать программу, которая печатает самую длинную подстроку переменной, в которой буквы встречаются в алфавитном порядке.

например. s = 'onsjdfjqiwkvftwfbx', он должен вернуть 'dfjq'.

как новичок, код, написанный ниже:

y=()
z=()
for i in range(len(s)-1):
    letter=s[i]
    while s[i]<=s[i+1]:
        letter+=s[i+1]
        i+=1
    y=y+(letter,)
    z=z+(len(letter),)
print(y[z.index(max(z))])

Однако приведенный выше код всегда будет возвращать

IndexError: string index out of range.

Он будет давать желаемый результат, пока я не изменю его на range(len(s)-3).

Хотел бы спросить совета по:

  1. Почему range(len(s)-1) приведет к такой ошибке сообщение? Чтобы позаботиться об индексе до i + 1, я уже уменьшил значение диапазона на 1. Мое объяснение состоит в том, что если длина переменной s равна 14, она имеет индекс от 0 до 13, диапазон (14) дает значение 0-13. Однако, поскольку мой код включает индекс i + 1, диапазон уменьшается на 1, чтобы позаботиться об этой части.

  2. Как изменить приведенный выше код для получения правильного результата. если s = 'abcdefghijklmnopqrstuvwxyz', приведенный выше код с диапазоном (len (s) -3) снова возвращает IndexError: string index out of range. Зачем? что не так с этим кодом?

Любая помощь приветствуется ~

Ответы [ 2 ]

0 голосов
/ 20 июня 2020

Относительно «1»: На самом деле, использование range(len(s)-2) тоже должно работать.

Причина range(len(s)-1) не работает:

Для 'onsjdfjqiwkvftwfbx' len() будет равно 18. Тем не менее, максимальный индекс, на который вы можете ссылаться, равен 17 (поскольку индексирование начинается с 0). Таким образом, когда вы l oop через «i», в какой-то момент i увеличится до 17 (что соответствует len(s)-1), а затем попытайтесь получить доступ к s[i+1] в вашем сравнении while (что невозможно) .

Относительно «2»: Должно работать следующее:

current_output = ''
biggest_output = ''
for letter in s:
    if current_output == '':
        current_output += letter
    else:
        if current_output[-1]<=letter:
            current_output += letter
        else:
            if len(current_output) > len(biggest_output):
                biggest_output = current_output
            current_output = letter

if len(current_output) > len(biggest_output):
    biggest_output = current_output
    
print(biggest_output)
0 голосов
/ 20 июня 2020

Причина выхода индекса за пределы диапазона в том, что в вашем внутреннем while l oop вы продвигаетесь i без проверки его диапазона. Ваш код также очень неэффективен, так как у вас есть вложенные циклы, и вы выполняете много относительно дорогостоящих конкатенаций строк. Алгоритм линейного времени без конкатенаций будет выглядеть примерно так:

s = 'onsjdfjqiwkvftwfbcdefgxa'

# Start by assuming the longest substring is the first letter
longest_end = 0
longest_length = 1
length = 1

for i in range(1, len(s)):
    if s[i] > s[i - 1]:
        # If current character higher in order than previous increment current length
        length += 1
        if length > longest_length:
            # If current length, longer than previous maximum, remember position
            longest_end = i + 1
            longest_length = length
    else:
        # If not increasing order, reset current length
        length = 1

print(s[longest_end - longest_length:longest_end])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...