我有24个字母的数字字符:“A B C D E F G H I J K L M N O P Q R S T U V W X”
我想收集所有案例:3个独特的字符。
第一个案例:ABC,DEF,GHI,JKL,MNO,PQR,STU,VWX
答案 0 :(得分: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版本,但我认为这是最直接的。)
答案 1 :(得分:0)
字母表字母和集合列表的排列之间存在1:1的关系。基本上,一旦你有了字母表的排列,你只需要调用array_chunk
来获得集合。
现在,24岁!任何东西(即620448401733239439360000)永远不会适合内存(无论是RAM还是磁盘),所以你能做的最好的事就是在n
和1
之间生成一个24!
(排列数)然后生成这种排列。对于最后一步,请参阅示例Generation of permutations following Lehmer and Howell以及引用的文章。
答案 2 :(得分:0)
这有点晚了,但是对于其他人来说:如果你想将一个字符串分成3个字符的块,试试PHP内置的str_split()函数。它接受$string
和$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的答案会更有意义。