如何在php中找到给定数字的所有可能的字母组合

时间:2014-12-22 07:37:34

标签: php combinations

我需要PHP中的高效代码,为给定的数字生成所有可能的字母组合。为数字指定字母为2> ABC 3-> DEF 4-> GHI 5-> JKL 6-> MNO 7-> PQRS 8-> TUV 9-> WXYZ我已经尝试了下面的代码,但它没有给出预期的输出。

function f_($n)
    {
        if($n<2) { return 1; }
        for($x = 2;$n-1>1;$x*=$n--);
        return $x;
    }
    function array_restore($r){
        $clean = array();
        if(is_array($r)){
            foreach($r as $k){
                $clean[] = $k;
            }
        }
        return $clean;
    }

    function cmb($val, $l, $u=false){
        $len = $l;
        $str = strlen($val);
        $tot = f_($str) / f_($str-$len);

        $combo = array();
        if($l <= $str){
            for($i=0;$i<$tot*8;$i++){
                if(substr(str_shuffle($val), 0, $len) !== @$combo[$i]){
                    $combo[$i] = substr(str_shuffle($val), 0, $len);
                }
            }
        }else{
            return "length must be less than the length of your string.";
        }
        if($u == true){
            $x = array_unique($combo);
            return array_restore($x);
        }else{
            return $combo;
        }
    }

    $res   = cmb($value, 3, true);
    echo "<pre><br/>";
    print_r($res);


       Requirements:

iF我输入为628它应该生成'MNOABCTUV'中所有可能的字符组合 输出应该生成 - 2个字母组合 - 3个字母组合 - 4个字母组合 - 5个字母组合 - 6个字母组合

示例:我需要3个字母单词的所有组合     [0] =&gt; UBM     [1] =&gt; OTV     [2] =&gt; NAU     [3] =&gt; OMA     [4] =&gt; BUA     [5] =&gt; VCM     [6] =&gt; AVT     [7] =&gt; AOM     [8] =&gt; NTV     [9] =&gt; VMB     [10] =&gt; VOA     [11] =&gt;非统组织     [12] =&gt; VBU     [13] =&gt; MNV     [14] =&gt; AMO     [15] =&gt; OVC     [16] =&gt;曹     [17] =&gt; UTN     [18] =&gt; TVN     [19] =&gt; TVC     [20] =&gt; BNO     [21] =&gt; VAN     [22] =&gt; CBV     [23] =&gt; VTN。 .. ..所以.......

时间复杂度应该更低并且代码效率更高。

1 个答案:

答案 0 :(得分:0)

$arr = array('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z');
    $newOne = array();
    $c = count($arr); //count for your lang letters..
    for($i = 0;$i<$c;$i++){
        for($j = 0;$j<$c;$j++){
            for($k = 0;$k<$c;$k++){
                $val = $arr[$i].$arr[$j].$arr[$k];
                array_push($newOne,$val);
            }
        }
    }

这应该有效。