【问题标题】:how to find all possible letter combinations for the given numbers in php如何在php中找到给定数字的所有可能的字母组合
【发布时间】:2014-12-22 07:37:34
【问题描述】:

我需要一个高效的 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:

如果我输入为 628,它应该从“MNOABCTUV”生成所有可能的字符组合 输出应该产生 - 2 个字母组合 - 3个字母组合 - 4 个字母组合 - 5个字母组合 - 6 个字母组合

示例:我需要 3 个字母单词的所有组合 [0] => UBM [1] => OTV [2] => 瑙 [3] => 奥马 [4] => 布阿 [5] => VCM [6] => AVT [7] => AOM [8] => NTV [9] => 虚拟机 [10] => 美国之音 [11] => 非统组织 [12] => VBU [13] => MNV [14] => AMO [15] => OVC [16] => 曹 [17] => UTN [18] => 电视网 [19] => 电视广告 [20] => BNO [21] => 货车 [22] => CBV [23] => VTN 。 .. .. 等等....

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

【问题讨论】:

  • 所以......无论你做什么,复杂度都将是 O(n)!。二、数字从何而来:你说的是直列数组吗?
  • 你正在做的事情会很慢。查找 2 个字母的所有组合将在最好的情况下进行 26^2 (676) 次操作。对于 10 个字母,需要 26^10 (141,167,095,653,376) 次操作。为什么你需要这样做我不知道,但我严重怀疑你有任何理由可能是值得的。
  • 将值存储在二维数组中。数组(2 => 'ABC', 3 => 'DEF', 4 => 'GHI', 5 => 'JKL', 6 => 'MNO', 7 => 'PQRS', 8 => 'TUV' , 9 => 'WXYZ');

标签: php combinations


【解决方案1】:
$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);
            }
        }
    }

这应该可以。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-29
    • 2011-06-05
    • 1970-01-01
    相关资源
    最近更新 更多