Распечатайте самую длинную буквенную подстроку, используя Python, а для связей напечатайте первую подстроку

Предположим, что s — это строка символов нижнего регистра. Напишите программу, которая выводит самую длинную подстроку s, в которой буквы расположены в алфавитном порядке.

Например, если s = 'azcbobobegghakl', ваша программа должна вывести

Самая длинная подстрока в алфавитном порядке: beggh

В случае ничьей выведите первую подстроку. Например, если s = 'abcbcd', ваша программа должна напечатать

Самая длинная подстрока в алфавитном порядке: abc

Вот код, который я нашел. Как реализовать последнее условие в заданном выше вопросе о связях?

    *s = raw_input('provide string: ')
    result = []
    final = []
    for letters in s:
        result = result + [letters]        
        if result == sorted(result) and len(result) >= len(final):
            final = result            
        elif result != sorted(result):
            result = [result[len(result)-1]]        
    print('Longest substring in alphabetical order is: '+(''.join(final)))*

person Ishaan Arora    schedule 26.06.2015    source источник
comment
Ваш вопрос должен включать в себя код, который вы пробовали, и проблему, с которой вы столкнулись.   -  person Brent Washburne    schedule 26.06.2015


Ответы (1)


Я бы подошёл к проблеме следующим образом:

  • Давайте определим две строки: current строку возрастающих букв и текущую longest строку.
  • Обе строки инициализируются первой буквой. (Таким образом, мы всегда можем прочитать их последнее письмо.)
  • Затем мы перебираем входную строку s (начиная со второго символа).
  • Если текущий персонаж c удовлетворяет требованию c >= current[-1], мы добавляем его в текущее решение.
  • Возможно, мы сохраним строку current как longest.
  • Если c не соответствует требованиям заказа, мы начинаем с нового решения current = c.
  • Наконец, мы печатаем строку longest.
s = "azcbobobegghakl"
longest = s[0]
current = s[0]
for c in s[1:]:
    if c >= current[-1]:
        current += c
        if len(current) > len(longest):
            longest = current
    else:
        current = c
print "Longest substring in alphabetical order is:", longest

Как исправить код, написанный wrt. указанное условие:

Используйте > вместо >= в сравнении len(result) >= len(final), т. е. обновляйте решение final только в том случае, если оно длиннее, но не в том случае, если оно имеет ту же длину.


Учитывая комментарий Дилана

Ты прав. Я обновил и код, и описание, чтобы правильно обрабатывать случай, когда s заканчивается самой длинной буквенной подстрокой. (Было достаточно переместить else: на две строки вниз.)

person Falko    schedule 26.06.2015
comment
Большое спасибо. Я новичок в Python, и я не знал, как решить эту проблему. - person Ishaan Arora; 26.06.2015
comment
вам нужно добавить одну строку над вашим оператором печати (из цикла for), который является вашим if len(current)> len(longest): longest = current. Поскольку, если вы этого не сделаете, обновление longest = current внутри цикла for может не произойти. Попробуйте тестовый пример «abcdef», вы поймете, что я имею в виду. - person Dylan; 31.08.2017