组合数组1中的多个字符串以形成数组2

时间:2013-10-03 21:18:19

标签: ruby

我有一个字符串数组“A”和一个目标字符串“B”。 B字符串 仅包含从a到z的字符,并且不包含空格。我需要一个ruby函数 返回字符串数组,表示从数组A的元素中形成B的所有可能方法。返回组合的顺序无关紧要。来自A的单词可以多次使用。

示例:

A = [‘x’, ‘y’, ‘z’, 'yz',‘xy’, ‘xyz’] 

B = ‘xyz’ 

method(A, B) => [x y z, x yz, xyz, xy z]  

我研究了排列方法,但无法使其发挥作用。

2 个答案:

答案 0 :(得分:1)

这是一个不会遍历排列的递归解决方案:

def find_possible_combinations( list, str )
  list.select { |a| str.start_with? a }.map do |a|
    if a == str
      [a]
    else
      find_possible_combinations( list-[a], str.slice(a.length..-1) )
        .map { |c| "#{a} #{c}" }
    end
  end.flatten
end

puts "#{find_possible_combinations( %w( x y z yz xy xyz ), 'xyz' )}"

输出:

["x y z", "x yz", "xy z", "xyz"]

答案 1 :(得分:0)

A = %w[x y z yz xy xyz] 
B = "xyz"
SIZE = B.size

def combos
  (1..SIZE).inject([]) {|c, n| c.concat(combos_by_size(n))}.reject(&:empty?)
end

# Select all combinations of size n having SIZE characters
def combos_by_size(n)
  A.combination(n).to_a.inject([]) {|c, a| c.concat(matching_combos(a)) if a.join.size == SIZE; c}.reject(&:empty?)
end


# Select all matching combinations using all elements of array a
def matching_combos(a)
  a.permutation.to_a.select {|p| p.join == B}
end

combos # => [["xyz"], ["x", "yz"], ["xy", "z"], ["x", "y", "z"]]