【发布时间】: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