2012-03-16 43 views

回答

2

我已經already answered this question for Python,所以我很快移植我的解決方案到紅寶石:

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 

看到我的其他答案的如何以及爲什麼這個工程的完整說明。

3

如果我理解正確的話,你要插入 「分隔符」 到一個列表,對其分區。以你的榜樣,並使用|字符表示分隔符,

1 2 3 
1 2|3 
1|2 3 
1|2|3 

是你想要的解決方案。

在列表中(我稱之爲列表而不是集合,因爲您需要保存訂單)n元素,有n-1潛在的分隔符位置。在上面的例子中,有兩個位置。在每個位置,分隔符可能存在也可能不存在。

您可以使用從02^(n-1) - 1的數字的二進制表示來列出分隔符的所有可能排列。在你的例子中,這將是0..3的數字。

0: 00 
1: 01 
2: 10 
3: 11 
+0

這真的很有幫助。由於我需要組合的確切數量的分隔符,我發現我的問題也可以專門針對這個問題:http://stackoverflow.com/questions/1851134/generate-all-binary-strings-of-length-n-with- k-bits-set,但由於我有小的集合,給出的函數和過濾掉非擬合的組合對現在來說是有好處的。 – mbdev 2012-03-16 18:11:05