輸入一個字符串,打印出該字符串的所有排列


輸入一個字符串,打印出該字符串的所有排列。

例如輸入字符串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)表示。

計算公式:image

運用遞歸。

思路:輪詢,遞歸對后面元素輪詢,不斷交換首項位置,讓每一項可以順序輸出,遞歸結束恢復交換,使上層輪詢結構正常。標記位置到達數組尾部,輸出元素。

圖示:

image

<?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;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM