Ruby 给定字符串的所有可能排列?
我用Ruby怎么做Ruby 给定字符串的所有可能排列?,ruby,Ruby,我用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 如果有人不想使用内置函数: def p
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
如果有人不想使用内置函数:
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是可选的
- 字符串可以改为变量
- chars非常快,它将字符串分隔为单个字符数组
- map有很多很酷的应用程序,它接受一个对象,并在块完成后返回它,在本例中是join操作
- &:join可以替换为{| i | i.join},如下所示: p“abc”.chars.permutation.map{i | i.join}
$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)
您的意思是在输入字符串中包含四个字符吗?根据你的例子,它应该是“abc”。所有可能的排列你在面试问题中得到了这个吗?我听过一次,我认为在2到3分钟内回答这个问题是不现实的。这是一种你知道答案,或者需要2、3分钟以上的时间不,只是随便玩玩。很高兴知道有人会问我这个问题=p@動靜能量 当你对stdlib很了解的时候,这并不难。我几乎总是要从Enumerable中查找方法。在您一直使用它们之前,这是非常令人困惑的。另外,如果您是从字符串开始的:
“abc”.chars.to_a.permutation.map&:join
。为什么此方法会接受一个结果参数?“result”是在某一时间保存结果置换的参数,当其长度等于输入长度时,这意味着我们得到了一个输入排列。
p "abc".chars.permutation.map &:join
["abc", "acb", "bac", "bca", "cab", "cba"]
$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)