@HrustHr

Как получить все возможные комбинации?

Как сгенерировать все возможные комбинации, если в ряде заменить одну из букв на Z?
Т.е. получить из abcdefg: Zbcdefg…abcZefg…abcdefZ.

Как сгенерировать все возможные комбинации, если в ряде заменить две буквы на Z и Y?
Т.е. получить из abcdefg: ZbcYefg…abZYefg…abcdeZY.
  • Вопрос задан
  • 241 просмотр
Решения вопроса 1
wataru
@wataru Куратор тега Алгоритмы
Разработчик на С++, экс-олимпиадник.
itertools.combinations. Скармливаете туда range индексов вашей строки. Получаете список из 1/2/сколько надо сделать замен индексов, на эти позиции ставьте ваши Z, Y.

Вот набросок кода.
Я не питонист, возможно есть более лаконичная реализация. Особенно мерзкий хак с перобразованием строки в list, потому что строки в питоне immutable.

import itertools

def GenerateAll(source, rep):
  for comb in itertools.combinations(range(len(source)), len(rep)):
    s = list(source)
    for (i, j) in enumerate(comb):
      s[j] = rep[i];
    yield "".join(s)
    
print(list(GenerateAll("abcd", "XY")))
# ['XYcd', 'XbYd', 'XbcY', 'aXYd', 'aXcY', 'abXY']
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@CBET_TbMbI
Самый простой для понимания способ - цикл в цикле. Внешним циклом меняйте один символы по порядку на Z. Во вложенном перебирайте замены оставшихся букв хоть на Z, хоть на Y.
Ответ написан
Комментировать
tsklab
@tsklab
Здесь отвечаю на вопросы.
СТРОКА
ЦИКЛ i ОТ 1 ДО ДЛИНА(СТРОКА)
  ЗАМЕНИТЬ(СТРОКА, i, 'Z')

СТРОКА
ЦИКЛ i ОТ 1 ДО ДЛИНА(СТРОКА)-1
  ЗАМЕНИТЬ(СТРОКА, i, 'Z')
    ЦИКЛ j ОТ i+1 ДО ДЛИНА(СТРОКА)
        ЗАМЕНИТЬ(СТРОКА, j, 'Y')
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы