【Ruby】【アルゴリズム】重複を含む要素の順列(非数値もOK)
重複を含む順列
重複を含む要素のすべての順列を求める
(例)
"3331"→1333,3133,3313,3331
"aab"→aab,aba,baa
たとえば "aabb" だったら4!/(2!*2!) で6通り。
コードで書くとこういう感じ。
使った要素はフラグを立てて、使っていない要素を配列につめていく。
重複順列は、これ以上簡単な書き方はないと思うんだけど、、
どうかなー。
def _permutation(arr, candidate, answers, isused) if candidate.length == arr.length a = candidate.join("") answers << a if !answers.include?(a) return end (0...arr.length).each do |i| tmp = candidate.dup _isused = isused.dup if _isused[i] == 0 tmp << arr[i] _isused[i] = 1 _permutation(arr, tmp, answers, _isused) end end answers end def permutation(input) arr = input.split("") return _permutation(arr, [] ,[],Array.new(arr.size, 0)) end p permutation("aabb")
■実行結果
["aabb", "abab", "abba", "baab", "baba", "bbaa"]
これくらいならさくさく書けるようになってきたー。