Чтобы получить результат, указанный в вашем вопросе, хотя и не в том же порядке, это то, что я буду делать.
Я буду использовать Mathematica код, но концепции универсальны.
string = "Mary had a little lamb";
set = StringSplit[string]
n = [email protected]
{"Mary", "had", "a", "little", "lamb"}
5
Таким образом, вы будете нуждаться в функцию, которая разбивает предложение на слова (StringSplit).
Тогда вам понадобится функция для генерации integer partitions и функция перестановки, которая будет знать о повторяющихся элементах. Алгоритмы для обоих можно найти здесь, в StackOverflow.
IntegerPartitions[n]
{{5}, {4, 1}, {3, 2}, {3, 1, 1}, {2, 2, 1}, {2, 1, 1, 1}, {1, 1, 1, 1, 1}}
После того, как мы переставлять каждый раздел ("для каждого" является /@
) мы получаем все пути линейно разделить набор из пяти частей:
parts = Join @@ Permutations /@ IntegerPartitions[n]
{{5}, {4, 1}, {1, 4}, {3, 2}, {2, 3}, {3, 1, 1}, {1, 3, 1},
{1, 1, 3}, {2, 2, 1}, {2, 1, 2}, {1, 2, 2}, {2, 1, 1, 1}, {1, 2, 1, 1},
{1, 1, 2, 1}, {1, 1, 1, 2}, {1, 1, 1, 1, 1}}
Наконец, нам нужно чтобы разбить набор в соответствии с последовательностями длин.Я называю мое dynamicPartition:
dynamicPartition[set, #] & /@ parts // Column
{{Mary,had,a,little,lamb}}
{{Mary,had,a,little},{lamb}}
{{Mary},{had,a,little,lamb}}
{{Mary,had,a},{little,lamb}}
{{Mary,had},{a,little,lamb}}
{{Mary,had,a},{little},{lamb}}
{{Mary},{had,a,little},{lamb}}
{{Mary},{had},{a,little,lamb}}
{{Mary,had},{a,little},{lamb}}
{{Mary,had},{a},{little,lamb}}
{{Mary},{had,a},{little,lamb}}
{{Mary,had},{a},{little},{lamb}}
{{Mary},{had,a},{little},{lamb}}
{{Mary},{had},{a,little},{lamb}}
{{Mary},{had},{a},{little,lamb}}
{{Mary},{had},{a},{little},{lamb}}
Nice :), но моя проблема имеет ограничение в том, что, если <2> установлен в ложь, я не могу иметь <3> или <4> или любые такие следующие переменные для будь настоящим. Это не сохранит порядок. Пример: такая комбинация недопустима - {'Mary', 'little lamb'} – codemaniac
Спасибо за пример :) помог – codemaniac
Я не думаю, что было бы сложно найти шаблон, если вы думаете об этом в двоичном формате числа, правильно? – Shahbaz