php递归如何实现字符串的排列?

输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 结果请按字母顺序输出。

3个回答

<?php

class Test{

/**
 * arr 元素数组,
 * m 从arr 中选择的元素个数
 * isRepeat arr中的元素是否可以重复(默认重复)
 * b 中间变量
 * n 等于第一次调用时的 m
 * res 存放结果
 */
public static function combine($arr, $m, $isRepeat = 0, $b = [], $n = 0, $res = []) {
    !$n && $n = $m;
    if($m == 1) {
        foreach($arr as $item)
            //拼接中间变量到数组中去
            $res[] = array_merge($b, [$item]);
    } else {
        foreach($arr as $key => $item) {
            $b[$n - $m] = $item;
            $tmp = $arr;
            if(!$isRepeat) unset($tmp[$key]);// 如果不可重复
            $res = self::combine($tmp, $m-1, $isRepeat, $b, $n, $res);
        }
    }
    return $res;
}

}

var_dump(Test::combine(['a','b', 'c'], 3));


你问的应该不是编程语言问题,是算法的问题,这个是全排列问题,可以使用简单的递归实现。
我写过java版本的,你可以在这里下载http://download.csdn.net/detail/lin_not_for_codes/9761871。
我讲一下简单的思路,对输入的字符串进行长度读取,对每一位的字符作为起始字符,然后对剩下的字符逐个进行排序记录,当剩下最后一个字符时输出一种排序结果。

lin_not_for_codes
lin_not_for_codes 回复爱写博客的你: 链接后面多了个句号,去掉就可以了
3 年多之前 回复
qq_27681741
卡二条 链接不存在
3 年多之前 回复
 <?php

    $str = "acdakjflsdaf";

    $data = randStr($str);

    var_dump($data);

    function randStr($str)
    {
        $temp[] = $str;

        $n = strlen($str);
        for ($i = 0; $i < $n; $i++)
        {
            // 把第一个移动到最后一个
            $fir_char = $str{0};

            $str = substr($str, 1);
            $str .= $fir_char;

            $temp[] = $str;
        }

        sort($temp);

        return $temp;
    }

输出结果:

 ---------- Debug PHP ----------
array(13) {
  [0] =>
  string(12) "acdakjflsdaf"
  [1] =>
  string(12) "acdakjflsdaf"
  [2] =>
  string(12) "afacdakjflsd"
  [3] =>
  string(12) "akjflsdafacd"
  [4] =>
  string(12) "cdakjflsdafa"
  [5] =>
  string(12) "dafacdakjfls"
  [6] =>
  string(12) "dakjflsdafac"
  [7] =>
  string(12) "facdakjflsda"
  [8] =>
  string(12) "flsdafacdakj"
  [9] =>
  string(12) "jflsdafacdak"
  [10] =>
  string(12) "kjflsdafacda"
  [11] =>
  string(12) "lsdafacdakjf"
  [12] =>
  string(12) "sdafacdakjfl"
}

输出完成 (耗时 0 秒) - 正常终止

你看是否符合你的要求~~~

qq_27681741
卡二条 不对,不仅有重复的个数也不正确
3 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问