输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 结果请按字母顺序输出。
<?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 秒) - 正常终止
你看是否符合你的要求~~~
你问的应该不是编程语言问题,是算法的问题,这个是全排列问题,可以使用简单的递归实现。
我写过java版本的,你可以在这里下载http://download.csdn.net/detail/lin_not_for_codes/9761871。
我讲一下简单的思路,对输入的字符串进行长度读取,对每一位的字符作为起始字符,然后对剩下的字符逐个进行排序记录,当剩下最后一个字符时输出一种排序结果。
<?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));