算法:全排列(BFS)

题目

给出一个字符串,输出该字符串的全排列

图解

用笔画出了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
)
发布了200 篇原创文章 · 获赞 26 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/why444216978/article/details/103359817