Найдите самую длинную подстроку в алфавитном порядке. Что не так с моим кодом

Пока у меня есть:

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)
Другие вопросы по тегам