给定一个字符串数组
["the" "cat" "sat" "on" "the" "mat"]
我希望从任何起始位置依次获得所有项目组合,例如
["the"]
["the" "cat"]
["the" "cat" "sat"]
...
["cat" "sat" "on" "the" "mat"]
["sat" "on" "the" "mat"]
["on" "the" "mat"]
...
["sat" "on"]
["sat" "on" "the"]
不允许使用原始序列或缺少元素的组合,例如
["sat" "mat"] # missing "on"
["the" "on"] # reverse order
我还想知道这个操作是否有一个特定的名称,或者是否有一种更简洁的方式来描述它。
感谢。
答案 0 :(得分:6)
如果你是单行,你可以尝试
(0..arr.length).to_a.combination(2).map{|i,j| arr[i...j]}
BTW,我认为这些被称为数组的“所有子序列”。
答案 1 :(得分:4)
在每个可能的结束位置上迭代每个起始位置和每个起始位置:
arr = ["the", "cat", "sat", "on", "the", "mat"]
(0 ... arr.length).map do |i|
(i ... arr.length).map do |j|
arr[i..j]
end
end.flatten(1)
#=> [["the"], ["the", "cat"], ["the", "cat", "sat"], ["the", "cat", "sat", "on"], ["the", "cat", "sat", "on", "the"], ["the", "cat", "sat", "on", "the", "mat"], ["cat"], ["cat", "sat"], ["cat", "sat", "on"], ["cat", "sat", "on", "the"], ["cat", "sat", "on", "the", "mat"], ["sat"], ["sat", "on"], ["sat", "on", "the"], ["sat", "on", "the", "mat"], ["on"], ["on", "the"], ["on", "the", "mat"], ["the"], ["the", "mat"], ["mat"]]
flatten(1)
需要ruby 1.8.7+(或backports)。
答案 2 :(得分:0)
在这里你可以得到所有的组合
(1...arr.length).map{ | i | arr.combination( i ).to_a }.flatten(1)