php 全排列使用DFS

字符串的全排列

  • 给定 1,2,3
  • 输出:
    1,2,3
    1,3,2
    2,1,3
    2,3,1
    3,1,2
    3,2,1

其实是一个树形结构

             【】

 1             2            3

2 3 1 3 1 2
123 132 213 231 312 321

使用深度优先搜索 DFS

  • 深度 depth
  • 走过路径 path
  • 已经走过 used
  • 每次走完一条路径则 记录下来
  • 每次回溯 撤下上次的操作

可以看到 每次选择的路径的过程是一致的

  • 可以使用递归
  • 递归的退出是 depth 到最后

整个代码

点击查看代码
$num = 1;
function dfs($str, $len, $depth, $path, $used)
{

    // 深度已经结束退出选择
    if ($depth == $len) {
        global $num;
        echo $num++, " ", var_export(join('',$path)), PHP_EOL;
        return ;
    }

    //  创建 条件分支 递归分支
    for ($i = 0; $i < $len; $i++) {

        // 标记已经选择的数字
        if ($used[$i]) {
            continue;
        }


        //入栈
        array_push($path, $str[$i]);
        $used[$i] = true;

        // 递归选择
        dfs($str, $len, $depth + 1, $path, $used);

        // 回溯 撤下上一次选择
        array_pop($path);
        $used[$i] = false;


    }

}

$str = "abc";
dfs($str, strlen($str),0,[],[]);

另一本版本精简版本

点击查看代码
function dfs_1($str, $len, $depth)
{
    if ($depth == $len) {
        global $num;
        echo $num++, " : ", $str, PHP_EOL;
        return;
    }
    for ($i = $depth; $i < $len; $i++) {
        list($str[$depth], $str[$i]) = [$str[$i], $str[$depth]];
        dfs_1($str, $len, $depth + 1);
        list($str[$depth], $str[$i]) = [$str[$i], $str[$depth]];
    }
}
posted @ 2022-10-31 22:52  vx_guanchaoguo0  阅读(38)  评论(0编辑  收藏  举报