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]];
}
}
本文来自博客园,作者:vx_guanchaoguo0,转载请注明原文链接:https://www.cnblogs.com/guanchaoguo/p/16846202.html