给定字符串的所有可能排列?

我将如何在Ruby中执行此操作?

p "abc".all_possible_permutations 

会回来:

 [ "abc", "acb", "bca", "bac", "cba", "cab", ] 

编辑

感谢Jakub Hampl:

 class String def all_possible_permutations self.chars.to_a.permutation.map(&:join) end end 

 %w[abc].permutation.map &:join 

如果有人不想使用内置function:

 def permute(result,input) if(input.length == 0) return end if(input.length == 1) puts result + input[0] return end if(input.length == 2) puts result + input[0] + input[1] puts result + input[1] + input[0] return end (0...input.length).step(1).each do |i| firstpart = result+input[i] secondpart = (i > 0 ? input[0..(i-1)] : '') + (input[(i+1)..-1] || '') permute(firstpart,secondpart) end end permute('',gets.chomp) 

一条线:

 p "abc".chars.permutation.map &:join 

样本输出:

 ["abc", "acb", "bac", "bca", "cab", "cba"] 
  • p是可选的
  • 字符串可以是变量
  • chars很快,它将字符串分成单个字符数组
  • map有很多很酷的应用程序,它接受一个对象,并在块完成后返回它,在这种情况下是操作连接
  • &:join可以替换为{| i | i.join}像这样:

    p“abc”.chars.permutation.map {| i | 我参与 }

如果有人想使用基本算法获得此代码,请按以下步骤操作 –

  $count = 0 def permute(permuted_string, original_string, done_array) if permuted_string.length == original_string.length $count = $count+1 puts "#{$count} #{permuted_string}" else (0..original_string.length-1).each do |i| if !done_array[i] done_array[i] = true permute(permuted_string+original_string[i], original_string, done_array) done_array[i] = false end end end end puts "Please enter the string for permutations" input = gets.chomp done_array = Array.new(input.length, false) permute("", input, done_array)