Найдите самую длинную подстроку в алфавитном порядке. Что не так с моим кодом
Пока у меня есть:
s = 'azcbobobegghakl'
i = 0
j = 1
temp = '' #temporary variable I use to change longest
longest = ''
for b in range(len(s)):
if s[i] <= s[j]: #checks if it's in alphabetical order
temp+=s[i]
if len(longest) < len(temp):
longest = temp
else:
temp = '' #reset temp after every substring
if len(longest) < len(temp):
longest += temp #update longest if the new substring is longer
i +=1
if j < len(s) - 1 : # because otherwise i get an IndexError
j +=1
print('Longest substring in alphabetical order is:', longest)
Теперь моя проблема в том, что я всегда получаю правильную строку, НО без последней буквы. (например, здесь вместо "умоляю" я получаю "умоляю").
Я также должен сделать так, чтобы, если это ничья, первая считается самой длинной (если s = abcbcd, то abc должно быть самой длинной)
И наконец, я знаю, что этот вопрос уже задавался здесь уже несколько раз, но я хочу исправить код, который придумал, если это возможно, а не просто использовать чужой код целиком.
5 ответов
Вы сравниваете s[i]
с s[i+1]
, но только добавляя s[i]
в temp
, Вместо этого всегда начинайте с текущей буквы в temp
и добавить s[i+1]
в temp
после сравнения
s = 'azcbobobegghakl'
i = 0
temp = s[0] #temporary variable I use to change longest
longest = ''
for i in range(len(s)-1):
if s[i] <= s[i+1]: #checks if it's in alphabetical order
temp+=s[i+1]
if len(longest) < len(temp):
longest = temp
else:
temp = s[i+1] #reset temp after every substring
if len(longest) < len(temp):
longest += temp #update longest if the new substring is longer
i +=1
print('Longest substring in alphabetical order is:', longest)
# Longest substring in alphabetical order is: beggh
Вы не учитываете текущий символ, если обнаружите, что следующий символ не в алфавитном порядке, и поэтому вам не хватает одного символа в конце.
Вместо этого вы должны всегда обрабатывать текущий символ перед сбросом temp
если следующий символ не в порядке.
s = 'azcbobobegghakl'
i = 0
temp = '' #temporary variable I use to change longest
longest = ''
for i in range(len(s)-1):
temp += s[i]
if len(longest) < len(temp):
longest = temp
if s[i] > s[i+1]: #checks if it's in alphabetical order
temp = '' #reset temp after every substring
if len(longest) < len(temp):
longest += temp #update longest if the new substring is longer
i +=1
print('Longest substring in alphabetical order is:', longest)
Это выводит:
Longest substring in alphabetical order is: beggh
Хотя я уже упоминал, как исправить ваш код в моем другом ответе, я также хотел сказать, что прямой способ сделать это - использовать itertools.accumulate
list(accumulate(s, lambda s, c: s+c if s[-1]<=c else c) )
# ['a', 'az', 'c', 'b', 'bo', 'b', 'bo', 'b', 'be', 'beg', 'begg', 'beggh', 'a', 'ak', 'akl']
Таким образом, однострочник для поиска самой длинной подстроки в алфавитном порядке
sorted(accumulate(s, lambda s, c: s+c if s[-1]<=c else c), key=len)[-1]
# 'beggh'
Чтобы решить проблему в конце, вы должны поставить ее на разрыв, когда код достигнет окончательного индекса. Кроме того, вам нужно добавить немного кода для сброса цикла, если вы достигли конца строки, и он все еще в алфавитном порядке (см. Ниже). Наконец, для ситуации, в которой самая длинная строка содержит только один символ, вам нужно определить свои начальные переменные для longest_word и word в s[0}. Просто продолжайте в том же духе, и в конце концов вы получите это. pythontutor.com - отличный инструмент для отладки и устранения неполадок.
s = 'abcdefghijklmnopqrstuvwxyz'
a = 0
b = 1
longest_word = s[0]
word = s[0]
for i in range(len(s)):
a = 0
b = 1
if i == len(s) - 2 or b > len(s)-1:
i += 1
print('Longest substring in alphabetical order is:', longest_word)
break
while (b < len(s)-i) and (s[i+a] <= s[i+b]):
word = s[i:i+b+1]
a += 1
b += 1
if len(word) > len(longest_word):
longest_word = s[i:i+b]
else:
i += 1
s = 'azcbobobegghakl'
i = 0
j = 1
temp = '' #temporary variable I use to change longest
longest = ''
for b in range(0, len(s) -1):
if s[b] <= s[b + 1]: #checks if it's in alphabetical order
if len(temp) == 0:
temp+= s[b]
temp+= s[b+1]
else:
temp+= s[b+1]
if len(longest) < len(temp):
longest = temp
else:
temp = '' #reset temp after every substring
if len(longest) < len(temp):
longest += temp #update longest if the new substring is longer
i +=1
if j < len(s) - 1 : # because otherwise i get an IndexError
j +=1
print('Longest substring in alphabetical order is:', longest)