给定字符串的所有可能排列?
我将如何在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)