輸入一個字符串,打印出該字符串的所有排列。
例如輸入字符串abc,則輸出由字符a、b、c所能排列出來的所有字符串 abc,acb,bac,bca,cab,cba。
題解
了解下排列的數學知識:
排列的定義:從n個不同元素中,任取m(m≤n,m與n均為自然數,下同)個元素按照一定的順序排成一列,叫做從n個不同元素中取出m個元素的一個排列;從n個不同元素中取出m(m≤n)個元素的所有排列的個數,叫做從n個不同元素中取出m個元素的排列數,用符號 A(n,m)表示。
計算公式:
運用遞歸。
思路:輪詢,遞歸對后面元素輪詢,不斷交換首項位置,讓每一項可以順序輸出,遞歸結束恢復交換,使上層輪詢結構正常。標記位置到達數組尾部,輸出元素。
圖示:
<?php
//全排列
//$result定義字符串,擔心內存超標,但字符達到8位以上,所占內存急劇膨脹
function fullArrange( $arr,$starti=0,&$result='' )
{
if( count($arr)<=0 )
throw new \Exception('空項');
$count = count($arr);
if($starti == $count-1){
$result .= implode($arr)."\n";
}
for ($i=$starti;$i<$count;$i++) {
if($starti!=$i){
$tmp = $arr[$i];
$arr[$i] = $arr[$starti];
$arr[$starti]= $tmp;
}
$this->fullArrange($arr,$starti+1,$result);
if($starti!=$i){
$tmp = $arr[$i];
$arr[$i] = $arr[$starti];
$arr[$starti]= $tmp;
}
}
return $result;
}
ini_set('max_execution_time',0);
$str = 'abc';
$strArr = str_split($str);
$r = $this->fullArrange($strArr);
var_dump($r);die;