题目
给出一个字符串,输出该字符串的全排列
图解
用笔画出了BFS所构建的树,树的叶子节点就是所有组合。
- 从第1个元素开始依次和后边做交换
- 从第2个元素开始依次和后边做交换
- ......
- 从第n-1个元素开始依次和后边做交换
最终启发我的草稿如下:
上代码
<?php
function dfs($arr, &$res, $pos)
{
if($pos == strlen($arr) - 1){
return ;
}
if($pos == 0){
$res[] = $arr;
for($i = 0; $i < strlen($arr)-1; $i++){
$tmp = $arr;
$tmpItem = $arr[$pos];
$arr[$pos] = $arr[$i+1];
$arr[$i+1] = $tmpItem;
$res[] = $arr;
$arr = $tmp;
}
}else{
$tmp = $res;
for($i = 0; $i < count($tmp); $i++){
for($j = $pos; $j < strlen($arr)-1; $j++){
$tmpItem = $tmp[$i][$pos];
$tmp[$i][$pos] = $tmp[$i][$j+1];
$tmp[$i][$j+1] = $tmpItem;
$res[] = $tmp[$i];
}
}
}
dfs($arr, $res, $pos+1);
}
function solution($arr)
{
if($arr <= 1){
return [$arr];
}
$res = [];
dfs($arr, $res, 0);
return array_unique($res);
}
print_r(solution('1234'));
看结果
Array
(
[0] => 1234
[1] => 2134
[2] => 3214
[3] => 4231
[4] => 1324
[5] => 1423
[6] => 2314
[7] => 2413
[8] => 3124
[9] => 3421
[10] => 4321
[11] => 4123
[12] => 1243
[13] => 2143
[14] => 3241
[15] => 4213
[16] => 1342
[17] => 1432
[18] => 2341
[19] => 2431
[20] => 3142
[21] => 3412
[22] => 4312
[23] => 4132
)