2012-01-21 2 views
1

Учитывая строку:Комбинации строки при сохранении порядка слов

String words = "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'} and so on... 

Заранее спасибо :)

ответ

4

Подумайте об этом так:

Mary <1> had <2> a <3> little <4> lamb 

Каждый из этих <number> с может быть истинным или ложным. Если это правда, то вы сокращаете предложение в этом месте.

Итак, если у вас есть п + 1 слов, ваша проблема получает сводится к идти через двоичное представление чисел с п бит, то есть от 0 до 2^п-1

Примеры:

0110 -> {'Mary had', 'a', 'little lamb'} 
1111 -> {'Mary', 'had', 'a', 'little', 'lamb'} 
0001 -> {'Mary had a little', 'lamb'} 
1011 -> {'Mary', 'had a', 'little', 'lamb'} 
+0

Nice :), но моя проблема имеет ограничение в том, что, если <2> установлен в ложь, я не могу иметь <3> или <4> или любые такие следующие переменные для будь настоящим. Это не сохранит порядок. Пример: такая комбинация недопустима - {'Mary', 'little lamb'} – codemaniac

+0

Спасибо за пример :) помог – codemaniac

+0

Я не думаю, что было бы сложно найти шаблон, если вы думаете об этом в двоичном формате числа, правильно? – Shahbaz

0

У вас есть 4 разделителя слов (пробелы) здесь. Каждое пространство может быть заменено (или нет) ограничителем предложения. Таким образом, существует 16 = 2^4 случая, которые соответствуют двоичным числам 0000 ... 1111.

1

Чтобы получить результат, указанный в вашем вопросе, хотя и не в том же порядке, это то, что я буду делать.
Я буду использовать 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}} 
Смежные вопросы