0

我有字母数组 24 字符:“ABCDEFGHIJKLMNOPQRSTU VW X”

我想收集所有案例:3 个独特的字符。

第一种情况:ABC、DEF、GHI、JKL、MNO、PQR、STU、VWX

4

3 回答 3

1

这有点晚了,但对于其他阅读此内容的人来说:如果您希望将字符串拆分为 3 个字符的块,请尝试 PHP 的内置str_split()函数。它接受一个$stringand$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 的答案更有意义。

于 2015-02-18T19:30:13.803 回答
0
$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版本,但我认为这是最直接的。)

于 2010-07-10T15:16:31.143 回答
0

字母表的字母排列与您的集合列表之间存在 1:1 的关系。基本上,一旦你有一个字母表的排列,你只需要调用array_chunk来获取集合。

现在,24!任何东西(即 620448401733239439360000)永远不会适合内存(无论是 RAM 还是磁盘),所以你能做的最好的事情是在和(排列数)n之间生成一个数字,然后生成这样的排列。对于这最后一步,请参见Lehmer 和 Howell 之后的排列生成以及其中引用的论文。124!

于 2010-07-10T15:18:13.917 回答