Программа выдает список всех возможных подстановок из заданной строки, необходимо отфильтровать подстроки не в алфавитном порядке - PullRequest
0 голосов
/ 26 января 2019

У меня есть список всех возможных подстрок из данной строки, мне нужно распечатать только подстроки в алфавитном порядке.

s = 'abcabcd'

a = len(s)

for x in range(a):
    for y in range(x,a-1):
        print(s[x:y+2])

если я поменяю на:

for x in range(a):
    for y in range(x,a-1):
        if s[y+1] >= s[y]:
            print(s[x:y+2])

Я получил точно такой же ответ, ничего не отфильтровано.

Текущий результат следующий:

аб азбука ABCA abcab abcabc abcabcd До нашей эры BCA bcab bcabc bcabcd Калифорния такси CABC ЦАБСиР аб азбука ABCD До нашей эры BCD CD

Я ищу результат:

аб азбука До нашей эры аб азбука ABCD До нашей эры BCD CD

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

Ответы [ 2 ]

0 голосов
/ 26 января 2019

Вы печатаете подстроку всякий раз, когда находите пару символов в порядке, а не тестируете все символов в подстроке.

Вы можете использовать функцию all() для проверки соответствия всей подстроки требованию.

s = 'abcabcd'
a = len(s)
for x in range(a):
    for y in range(x+2, a+1):
        if all(s[z] < s[z+1] for z in range(x, y-1)):
            print(s[x:y])
0 голосов
/ 26 января 2019

Одна из возможностей - сгенерировать все подстроки и проверить, находится ли каждая подстрока в строчном алфавите:

import string

sequence = string.ascii_lowercase

# https://stackoverflow.com/questions/22469997/how-to-get-all-the-contiguous-substrings-of-a-string-in-python
all_substrings = [s[i:j+1] for i in xrange(a) for j in xrange(i,a)]

for substr in all_substrings:
    if substr in sequence and len(substr) > 1:
        print(substr)

выход:

ab
abc
bc
ab
abc
abcd
bc
bcd
cd
...