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

Этот код отлично работает для всех строк, кроме тех, где нужен последний символ.

s='abcdefghijklmnopqrstuvwxyz'
sub =''
test =s[0]

for n in range(len(s)-1):
    if len(test) > len(sub):
        sub = test
    if s[n] >= s[n-1]:
        test += s[n]
    else:
        test = s[n]

print 'Longest substring in alphabetic order is: ' + str(sub) 

How do you suggest a possibility for doing this?

Спасибо заранее, ребята!

PS:

Спасибо за ответы. Проблема в том, что независимо от того, какой диапазон я набираю, подпеременная, которую я напечатаю, не получает все символы, которые я хочу. Цикл завершается до :\ Возможно проблема в самой программе.

Дополнительные советы? :)


person makemesteaks    schedule 23.06.2014    source источник
comment
Кроме того, у вас есть опечатка в print 'Logest substring..., должно быть Longest (как в вашем заголовке). / придирки   -  person Daan Timmer    schedule 23.06.2014


Ответы (3)


Ваша проблема связана с range(len(s)-1). Range генерирует список до значения параметра верхнего предела-1, поэтому вам не нужно вычитать1 до len(s), используйте:

range(len(s))

Из https://docs.python.org/2/library/functions.html#range

диапазон(стоп) диапазон(начало, стоп[, шаг]) Это универсальная функция для создания списков, содержащих арифметические прогрессии. Чаще всего используется в циклах for. Аргументы должны быть простыми целыми числами. Если аргумент шага опущен, он по умолчанию равен 1. Если аргумент начала опущен, он по умолчанию равен 0. Полная форма возвращает список простых целых чисел [начало, начало + шаг, начало + 2 * шаг, ...] . Если шаг положительный, последним элементом является наибольший старт + i * шаг меньше, чем стоп; если шаг отрицательный, последним элементом является наименьшее начало + i * шаг больше, чем стоп. шаг не должен быть равен нулю

С другой стороны, вы помечаете свой вопрос как python2.7, поэтому я предполагаю, что вы используете 2.7. В этом случае более эффективно использовать xrange вместо range, потому что таким образом вы будете использовать итератор вместо создания списка.

ИЗМЕНИТЬ

Из комментариев к этому вопросу вы можете изменить свой код на:

s='caabcdab'
sub =''
test =s[0]

for i in range(1,len(s)+1):
    n = i%len(s)
    if len(test) > len(sub):
        sub = test
        if i >= len(s):
            break
    if s[n] >= s[n-1]:
        test += s[n]
    else:
        test = s[n]

print 'Logest substring in alphabetic order is: ' + str(sub)
person Pablo Francisco Pérez Hidalgo    schedule 23.06.2014
comment
Спасибо за ответ, Пабло. Проблема в том, что независимо от того, какой диапазон я набираю, подпеременная, которую я напечатаю, не получает все символы, которые я хочу. Цикл завершается до :\ Возможно проблема в самой программе. - person makemesteaks; 23.06.2014
comment
@makemesteaks: Это потому, что вы назначаете тест субпрограмме до того, как она завершит проверку в цикле. Таким образом, последняя проверка завершается успешно, но обновленная строка не назначается подпрограмме. :) - person JRajan; 23.06.2014
comment
@makemesteaks Ваш алгоритм требует повторения еще одного символа, чтобы иметь возможность присвоить последний результат. Попробуйте с: for i in range(len(s)+1): n = i%len(s) - person Pablo Francisco Pérez Hidalgo; 23.06.2014
comment
Спасибо Раджан! проверьте мой ответ чуть ниже. Я только что назначил проверку в конец цикла. Теперь я проверю разные случаи и буду держать вас в курсе. - person makemesteaks; 23.06.2014
comment
Спасибо за усилия, ребята. Если я передвину if len(test) > len(sub): sub = test в конец цикла, это тоже не сработает. Кроме того, ваш код редактирования не работает и для некоторых других тестовых случаев, например: s = 'ocunhyfwiyizqh' должно быть cu, и я получаю oo< /б>, например. Извините, ребята, но это становится такой занозой в заднице. - person makemesteaks; 23.06.2014
comment
Окончательно! Спасибо! :) Теперь буду изучать этот код! Спасибо, и хорошего дня - person makemesteaks; 23.06.2014

вы enemurate вместо диапазона:

 s='abcdefghijklmnopqrstuvwxyz'

sub =''
test =s[0]

for n,value in enumerate(s):
    if len(test) > len(sub):
        sub = test
    if value >= s[n-1]:
        test += s[n]
    else:
        test = s[n]
person sundar nataraj    schedule 23.06.2014

Вы можете использовать следующий код:

s = 'abcdefgahijkblmnopqrstcuvwxyz'
sub = ''
test = s[0]

for index, character in enumerate(s):
    if index > 0:
        if character > s[index - 1]:
            test += character
        else:
            test = character
    if len(test) > len(sub):
        sub = test
print 'Longest substring in alphabetic order is: ' + str(sub)

Несколько указателей тоже.

  1. Строки Python являются итерируемыми. то есть вы можете пройти через них.
  2. Используйте enumerate, когда вам нужен индекс списка при его повторении.
person JRajan    schedule 23.06.2014