我有一个字符串数组“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]
我研究了排列方法,但无法使其发挥作用。
答案 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"]]