Это решение, которое минимизирует время разработчика, используя встроенный итератор. Это должно быть достаточно быстро для проблемных размеров, для которых сам ответ не является чрезмерно большим.
Существует взаимно однозначное соответствие между разделами строки и подмножествами потенциальных точек пересечения. Если длина строки n
, то есть n-1
мест, где вы можете отрезать строку. Прямым способом было бы итерации через такие подмножества, и для каждого такого подмножества срезайте строку таким образом. Вот подход Python, который использует стандартные модули itertools
:
import itertools
def multiSlice(s,cutpoints):
k = len(cutpoints)
if k == 0:
return [s]
else:
multislices = [s[:cutpoints[0]]]
multislices.extend(s[cutpoints[i]:cutpoints[i+1]] for i in range(k-1))
multislices.append(s[cutpoints[k-1]:])
return multislices
def allPartitions(s):
n = len(s)
cuts = list(range(1,n))
for k in range(n):
for cutpoints in itertools.combinations(cuts,k):
yield multiSlice(s,cutpoints)
Например:
>>> parts = allPartitions('World')
>>> for p in parts: print(p)
['World']
['W', 'orld']
['Wo', 'rld']
['Wor', 'ld']
['Worl', 'd']
['W', 'o', 'rld']
['W', 'or', 'ld']
['W', 'orl', 'd']
['Wo', 'r', 'ld']
['Wo', 'rl', 'd']
['Wor', 'l', 'd']
['W', 'o', 'r', 'ld']
['W', 'o', 'rl', 'd']
['W', 'or', 'l', 'd']
['Wo', 'r', 'l', 'd']
['W', 'o', 'r', 'l', 'd']
Следует отметить, что этот подход производит генерирует ['World']
в качестве раздела 'World'
. Это соответствует разрезанию с пустым набором точек разреза. Я рассматриваю это как функцию, а не ошибку, поскольку стандартное математическое определение раздела позволяет разбивать набор на одну часть. Если это нежелательно для ваших целей, исправление достаточно просто - просто перебирайте непустые подмножества точек разреза. С точки зрения приведенного выше кода, это исправление сводится к добавлению двух символов в allPartitions
: заменить
for k in range(n):
по
for k in range(1,n):
Эффективное с точки зрения того, как быстро и легко кодировать или с точки зрения того, как быстро он работает? Также есть максимальная длина строки? Это приведет к экспоненциально большему числу результатов при увеличении длины строки, и вы быстро удалите ошибки памяти. – wizzardmr42
Ii стремится ввести отдельные слова в этот алгоритм, и я бы хотел, чтобы он был эффективным в скорости, но мне любопытно увидеть два разных подхода :) – Ben
Не указывая «abcd» сам по себе, может быть по дизайну, но я думаю, что вы пропустили «a», «bc», «d». –