У меня есть строка из X и O, в которой надо поставить ещё n-количество X вместо n-количества O и вывести все возможные варианты. Но только такие, где исходные X остаются на своих местах.
Проблема в том, что исходные Х могут стоят абсолютно случайным образом и чередуясь с О неограниченное количество раз. Я пробовал через itertools делать комбинацию строки без исходных Х и потом вставлять их в каждую получившуюся комбинацию, но так это не проходило по времени(2 секунды). Прошу, помогите, пожалуйста)
Длина исходной строки не ограничена. n не больше количества О в строке.
Домашние задания: Информатика
Программирование, комбинаторика, python
Проходим по строке и считываем индексы всех O в отдельный список.
Комбинации делаем на базе списка индексов. Затем заменяем элементы по этим индексам в строке. И исходную строку надо где-то прихранить.
Суть в том, что однократное копирование строки целиком и изменение отдельных символов по индексу намного быстрее, чем сбор строки из кусков.
Если всё ещё будет долго, то можно выкинуть копирование из цепочки:
Не знаю, какой длины у вас строки, но на таких данных занимает какие-то миллисекунды:
mystr = "XOXOXO"
idxs = [i for i in range(len(mystr)) if mystr[i] == 'O']
Комбинации делаем на базе списка индексов. Затем заменяем элементы по этим индексам в строке. И исходную строку надо где-то прихранить.
combs = permutations(....) # сочетания номеров от 0 до len(idsx) - 1 вкл.
for c in combs:
newstr = mystr
for i in c: newstr[idxs[i]] = 'X'
print(newstr)
Суть в том, что однократное копирование строки целиком и изменение отдельных символов по индексу намного быстрее, чем сбор строки из кусков.
Если всё ещё будет долго, то можно выкинуть копирование из цепочки:
combs = permutations(....) # сочетания номеров от 0 до len(idsx) - 1 вкл.
for c in combs:
for i in c: mystr[idxs[i]] = 'X'
print(mystr)
for i in c: mystr[idxs[i]] = 'O'
Не знаю, какой длины у вас строки, но на таких данных занимает какие-то миллисекунды:
from itertools import permutations
mystr = "XOXOXOXOXOXO"
idxs = [i for i in range(len(mystr)) if mystr[i] == 'O']
combs = permutations(idxs, 4)
mylst = list(mystr)
for c in combs:
for i in c: mylst[i] = 'X'
print(''.join(mylst))
for i in c: mylst[i] = 'O'
Правда, если строку удвоить, то будет заметно дольше, но и тогда основную часть времени занимает print.
Абылай Кадиралиев
Огромное спасибо! Отличное решение
Похожие вопросы
- Программирование, Напишите пожалуйста на Python внесение депозита на банковскую карту.
- Задачи по комбинаторике
- Комбинаторика | Объясните решение
- Задача на комбинаторику
- Задача по комбинаторике
- Помогите пожалуйста решить задачу по программированию (Pasсal ABC.net).
- Д/З по программированию за 9-й класс
- Задачки по информатике, 7 класс. Python.
- Функции и процедуры на Python
- Python "Двойные и кратные циклы"