Все возможные перестановки данной строки?

Как я могу сделать это в Ruby?

p "abc".all_possible_permutations

Вернется:

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

Изменить

Благодаря Якубу Хэмплу:

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

Ответ 1

%w[a b c].permutation.map &:join

Ответ 2

Если кто-то не хочет использовать встроенную функцию:

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)

Ответ 3

Одна строка:

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

Пример вывода:

["abc", "acb", "bac", "bca", "cab", "cba"] 
  • p является необязательным
  • строка может быть переменной вместо
  • chars довольно быстро, он разделяет строку на массив одиночных символов
  • карта имеет массу полезных приложений, она берет объект и возвращает его после завершения блока, в этом случае операция join
  • &: объединение может быть заменено на {| я | i.join} следующим образом:

    p "abc".chars.permutation.map {| я | i.join}

Ответ 4

Если кто-то хочет иметь код для этого, используя базовые алгоритмы, вот как вы это делаете -

    $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)