我有字母数组 24 字符:“ABCDEFGHIJKLMNOPQRSTU VW X”
我想收集所有案例:3 个独特的字符。
第一种情况:ABC、DEF、GHI、JKL、MNO、PQR、STU、VWX
这有点晚了,但对于其他阅读此内容的人来说:如果您希望将字符串拆分为 3 个字符的块,请尝试 PHP 的内置str_split()函数。它接受一个$string
and$split_length
参数。例如:
$alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWX';
$grouped = str_split($alphabet, 3);
var_export( $grouped );
这将输出以下数组:
array ( 0 => 'ABC', 1 => 'DEF', 2 => 'GHI',
3 => 'JKL', 4 => 'MNO', 5 => 'PQR',
6 => 'STU', 7 => 'VWX', )
这适用于问题中给出的示例。如果您想拥有这 24 个字母的所有可能组合,Artefacto 的答案更有意义。
$alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
$c = strlen($alphabet);
$result = array();
for ($i = 0; $i < $c; ++$i) {
$current0 = $i;
for ($j = 0; $j < $c; ++$j) {
if ($current0 == $j) continue;
$current1 = $j;
for ($k = 0; $k < $c; ++$k) {
if (isset($current0 == $k || $current1 == $k)) continue;
$result[] = $alphabet[$i].$alphabet[$j].$alphabet[$k];
}
}
}
希望我正确理解了您的问题。这一个在三个循环中迭代字母表并且总是跳过已经使用的字符。然后我将结果推送到 $result。
但最好尝试只有五个字母的脚本;)使用 alls strlen($alphabet)(现在不想数......)将需要非常多的内存。
(我确信有一些比这更快的hacky版本,但我认为这是最直接的。)
字母表的字母排列与您的集合列表之间存在 1:1 的关系。基本上,一旦你有一个字母表的排列,你只需要调用array_chunk
来获取集合。
现在,24!任何东西(即 620448401733239439360000)永远不会适合内存(无论是 RAM 还是磁盘),所以你能做的最好的事情是在和(排列数)n
之间生成一个数字,然后生成这样的排列。对于这最后一步,请参见Lehmer 和 Howell 之后的排列生成以及其中引用的论文。1
24!