php实现全排列的算法一步步的优化

给定字符串 ‘abcd’要求把这个字符串的任意组合方式全部打印出来,
实现这个算法用了三个方法一个比一个进步,
1:先分析这个事情是全排列,可能性是 432*1 = 24 所以可知第一个坑4个可能二个坑三个可能
2:循环处理四个坑
3:上方法

/**最终版
 * @param string $s  这个是变化的字符串循环处理这个 从上一个方法的循环可以得到这个,当这个长度为1的时候应该是只是输出
 * @param string $s2 这个是形成的字符串 应该是返回  $s2 . $s[1].$s[2]
 */
function three ($s, $s2 = '') {
    $len = strlen($s);
    if($len <= 1) {
        echo $s2.$s.PHP_EOL;
    } else {
        for ($i = 0; $i< $len; $i++) {
            $lin = str_replace($s[$i], '', $s);
            three($lin, $s2.$s[$i]);
        }
    }
}
进阶版
function two ($s) {
    $a1 = $a2 = $a3 = $a4 = $a5 = [];
    for ($i = 0; $i $v) {
        $a2 = $a1;
        $str = $v;
        unset($a2[$k]);
        foreach ($a2 as $k1 => $v1) {
            $a3 = $a2;
            $str1 = $v1;
            unset($a3[$k1]);
            foreach ($a3 as $k2 => $v2) {
                $a4 = $a3;
                $str2 = $v2;
                unset($a4[$k2]);
                $str3 = array_pop($a4);
                $a5[] = $str.$str1.$str2.$str3 ;
            }
        }
    }
    return $a5;
}
基础版
function one ($s) {
    $a1 = $a2 = $a3 = [];
    for ($i = 0; $i $v) {
        $s1 = str_replace($v, '', $s);
        for ($i = 0; $i < strlen($s1); $i++) {
            $a2[] = $v.$s1[$i];
        }
    }
    foreach ($a2 as $k => $v) {
        $lin = [];
        for ($j = 0; $j

你可能感兴趣的:(其他)