Для переменной цикла не равно, что я думал, что будет? - PullRequest
0 голосов
/ 11 июня 2018

Итак, мне было поручено подсчитать самую длинную подстроку в строке, в которой буквы располагаются в алфавитном порядке.Я пришел с ответом, который работает и является правильным, но, честно говоря, у меня проблемы с пониманием моего собственного кода ... пожалуйста, потерпите меня.Я обошел свое недоразумение, чтобы создать рабочий код.Почему в этом примере переменная longest == 4 вместо 5?

s = 'azcbobobegghakl'

count = 0
longest = 0
end = 0

for a in range(len(s) - 1):
    if s[a] <= s[a + 1]:      # is s[a] greater than or = to the next char in string?
        count += 1            # if it is, +1 to count
        if count > longest:   # if count is greater than longest (longest is current longest - 1), continue, otherwise keep counting
            longest = count   # new longest is the current count because it is longest
            end = a + 1       # since end is in this if block, it counts the iteration where count was last greater than the longest
    else:                     # when count is never greater than longest again the longest will be the length of the longest string
        count = 0

start = end - longest

"""
end is the last position in the longest string (here it is 11 or h) 
longest is length of the string (here it is 4)
so the end - longest characters = the start of string which is 7 or b
"""

print('Longest substring in alphabetical order is: ' + s[start:end + 1])
#prints the letters in s from position 7 to 11 + 1 (+1 because end = index 11 but it goes up to and not including 11)

Ответы [ 3 ]

0 голосов
/ 11 июня 2018

Если приведенное ниже условие истинно, это означает, что у вас есть хотя бы подстрока длиной 2, но, поскольку вы начинаете count с 0, у вас на longest на единицу меньше, чем вы ожидаете.

s[a] <= s[a + 1]

Таким образом, решение состоит в том, чтобы инициализировать count в 1, что имеет смысл, поскольку одна буква всегда будет самой длинной подстрокой в ​​начальном случае (если только у вас нет пустой строки, которую выдолжен справиться).

0 голосов
/ 11 июня 2018

Я понял это, я полагаю, что когда он выполняет 11-ю итерацию (h longest всегда будет на одну короткую меньше действительной длины самой длинной алфавитной подстроки, поскольку окончательная оценка самой длинной подстроки равна false, что устанавливает ее обратно в 0, а не в 5. Поскольку longest == 4 этоlongest на самом деле может быть определено как количество истинных оценок в строке.

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

0 голосов
/ 11 июня 2018

Этот код учитывает пробелы .То есть вы ищете, когда разница между двумя буквами соответствует критерию.Это разница, и вы рассчитываете успешные различия, которые будут на единицу меньше, чем длина, необходимая для получения этого количества различий.

Вам, вероятно, понадобится:

start = end - longest - 1

Илинастроить count или end.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...