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。 .. ..所以.......
时间复杂度应该更低并且代码效率更高。
答案 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);
}
}
}
这应该有效。