Идея может быть в следующем. Получив строку «1234», вы разбиваете строку, вычисляя позиции подстрок.
import itertools
s="1234"
possibilities = []
for i in range(1,len(s)):
comb = itertools.combinations(range(1,len(s)), i)
possibilities+= [[s[0:c[0]]] + [s[c[i]:c[i+1]] for i in range(len(c)-1)] + [s[c[-1]:]] for c in comb]
выход
#[['1', '234'], ['12', '34'], ['123', '4'], ['1', '2', '34'], ['1', '23', '4'], ['12', '3', '4'], ['1', '2', '3', '4']]
Это решение не содержит ['1234'] на выходе (это потому, что основной цикл начинается с 1, а не с 0).
Просто сноска.
Количество способов разбить строку без включения исходной строки:
![enter image description here](https://i.stack.imgur.com/rP28T.png)
Идея, на которой основано это решение, заключается в следующем. По генерации каждого из них по формуле выше. Число велико, и алгоритм полиномиального времени не может существовать (по крайней мере, вы должны генерировать каждый элемент выходных данных, поэтому Ω(2^n)
является нижней границей для общей задачи).