字符串的组合同时保持单词顺序

时间:2012-01-21 11:45:41

标签: algorithm permutation combinations

给出一个字符串:

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...

提前致谢:)

3 个答案:

答案 0 :(得分:4)

以这种方式思考:

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

这些<number>中的每一个都可以是true或false。如果是,那么你在那个位置剪切了句子。

所以,如果你有n + 1个单词,你的问题会减少到通过n位的数字的二进制表示,即从0到2 ^ n-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'}

答案 1 :(得分:2)

要获得问题中显示的输出,虽然顺序不一样,但这就是我要做的 我将使用 Mathematica 代码,但概念是通用的。

string = "Mary had a little lamb";
set = StringSplit[string]
n = Length@set
{"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}}

一旦我们对每个分区进行置换(&#34;对于每个&#34;是/@),我们可以通过各种方式线性分割一组五个部分:

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[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}}

答案 2 :(得分:0)

这里有4个字分隔符(空格)。每个空格都可以用句子分隔符替换(或不替换)。因此存在16 = 2 ^ 4个情况,其对应于二进制数0000 ... 1111。