1. 程式人生 > >php每日小知識-字串全排列演算法

php每日小知識-字串全排列演算法

//從php中文網學習
//字串全排列演算法
/*全排列就是從n個不同元素中任取m(m≤n)個元素,按照一定的順序排列起來,叫做從n個不同元素中取出m個元素的一個排列,當m=n時所有的排列情況叫全排列。*/

$str = '123';
// 字串轉換為陣列
$arr = str_split($str);
// 呼叫perm函式
perm($arr, 0, count($arr)-1);
/**
 * 定義perm函式
 * @param [array] $arr // 排列的字串
 * @param [int] $default // 初始值
 * @param [int] $max // 最大值
 */
function perm
(&$arr, $default, $max) { // 初始值是否等於最大值 if ($default == $max) { // 將陣列轉換為字串 echo join('', $arr), PHP_EOL; } else { // 迴圈呼叫函式 for ($i = $default; $i <= $max; $i++) { // 呼叫swap函式 swap($arr[$default], $arr[$i]); // 遞迴呼叫自己 perm
($arr, $default + 1, $max); // 再次呼叫swap函式 swap($arr[$default], $arr[$i]); } } } function swap(&$a, &$b) { $c = $a; $a = $b; $b = $c; }

str_split函式
在這裡插入圖片描述
count函式
在這裡插入圖片描述
&引用
在PHP 中引用的意思是:不同的名字訪問同一個變數內容

//第二種實現的方法
function perm($arr, $str){ // $str 為儲存由 i 組成的一個排列情況
$cnt = count($arr); if($cnt == 1){ echo $str . $arr[0] .PHP_EOL; } else { for ($i = 0; $i < count($arr); $i++) { $tmp = $arr[0]; $arr[0] = $arr[$i]; $arr[$i] = $tmp; perm(array_slice($arr, 1), $str . $arr[0]); } } } $a = array('1', '2', '3', '4'); perm($a, '');

array_slice函式
在這裡插入圖片描述