【发布时间】:2012-04-01 17:47:02
【问题描述】:
这是对这个问题的跟进: Generate all "unique" subsets of a set (not a powerset)
我的问题是相同的,但我认为当需要保留新子集中和跨子集中的项目顺序时,可能会有更优化的解决方案。
例子:
[1, 2, 3]
会导致:
[[1], [2], [3]]
[[1, 2], [3]]
[[1], [2, 3]]
[[1, 2, 3]]
【问题讨论】:
这是对这个问题的跟进: Generate all "unique" subsets of a set (not a powerset)
我的问题是相同的,但我认为当需要保留新子集中和跨子集中的项目顺序时,可能会有更优化的解决方案。
例子:
[1, 2, 3]
会导致:
[[1], [2], [3]]
[[1, 2], [3]]
[[1], [2, 3]]
[[1, 2, 3]]
【问题讨论】:
如果我理解正确,您想将“分隔符”插入列表中,以对其进行分区。以您为例,并使用| 字符来指示分隔符,
1 2 3
1 2|3
1|2 3
1|2|3
是您想要的解决方案。
在n 元素的列表(我称它为列表而不是集合,因为您需要保留顺序)中,有n-1 潜在位置作为分隔符。在上面的示例中,有两个职位。在每个位置,分隔符可能存在也可能不存在。
您可以使用从0 到2^(n-1) - 1 的数字的二进制表示来列出所有可能的分隔符排列。在您的示例中,这将是从 0..3 开始的数字。
0: 00
1: 01
2: 10
3: 11
【讨论】:
我有 already answered this question for Python,所以我很快将我的解决方案移植到 Ruby:
def spannings(lst)
return enum_for(:spannings, lst) unless block_given?
yield [lst]
(1...lst.size).each do |i|
spannings(lst[i..-1]) do |rest|
yield [lst[0,i]] + rest
end
end
end
p spannings([1,2,3,4]).to_a
请参阅我的其他答案,了解有关其工作原理和原因的完整说明。
【讨论】: