1. 题目说明
给定一个可包含重复数字的序列,返回所有不重复的全排列。
输入: [1,1,2]输出:[[1,1,2],[1,2,1],[2,1,1]]
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);
