1. 题目说明

给定一个可包含重复数字的序列,返回所有不重复的全排列。

  1. 输入: [1,1,2]
  2. 输出:
  3. [
  4. [1,1,2],
  5. [1,2,1],
  6. [2,1,1]
  7. ]

2. 解题

<?php
class Solution {
    public $res = [];

    /**
     * @param $nums
     * @return array
     */
    public function permute($nums) {
        $this->do([], $nums);
        return array_values($this->res);
    }

    private function do($arr, $nums) {
        if (count($arr) == count($nums)) {
            // 将键转为值
            $tmp = [];
            foreach ($arr as $v1) {
                $tmp[] = $nums[$v1];
            }
            $key = implode('', $tmp);
            if (isset($this->res[$key])) return;
            // 记录一条合规排列
            $this->res[$key] = $tmp;
            return;
        }

        for ($i = 0; $i < count($nums); $i++) {
            if (in_array($i, $arr)) continue;
            array_push($arr, $i);
            $this->do($arr, $nums);
            array_pop($arr);
        }
    }
}
$nums = [1,2,1];
$cls = new Solution();
$r = $cls->permute($nums);
array_walk($r, function (&$v) {
    $v = implode(',', $v);
});
print_r($r);