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

我用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 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)