输入一个字符串,按字典序打印出该字符串中字符的所有排列。
例如,输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
思路:
先确定第一个位置的字符 ,然后与后面的每一个字符进行交换,对所有的字符都这样处理,直到长度一样打印。
例子:abc
第一步(for循环):abc将第一个字符与自己本身还与其他的字符进行交换后得到abc、bac、cba
第二步(递归实现):在第一步每种情况的基础上,保持第一个字符不变,求剩余几位的排列。
以bac为例:保持第一位不变,剩余两位ac的排列为:ac、ca。
直到保存到只剩下一个字符没有交换后加上前面的不变的字符作为输出结果为:bac、bca。
/**
* 字符串全排列
* @param $str string 字符串
* @param $start integer 开始
* @param $to integer 遍历
*
* @return string
*/
function permutation($str,$start,$to){
if($to < 1) {
return '';
}
if($start == $to) {
var_dump($str);
}else{
for($i = $start; $i<=$to; $i++) {
swap($str,$start,$i);
permutation($str,$start+1,$to);
swap($str,$i,$start);
}
}
}
// 交换字符串中 两个值
function swap(&$str,$i,$j) {
$tmp = $str[$j];
$str[$j] = $str[$i];
$str[$i] = $tmp;
}
$str = 'abc';
permutation($str,0,strlen($str)-1);