这是对这个问题的跟进: 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]]
答案 0 :(得分: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
答案 1 :(得分:2)
我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
请参阅我的其他答案,以获得有关其工作原理和原因的完整说明。