【发布时间】:2014-08-01 16:51:16
【问题描述】:
想象一下,我有一袋 26 个拼字游戏 - 一个对应英文字母表中的每个字母。
我的目标是创建一个由所有可能的字符串组成的数组,最长为 n 个字母。说n=3。
约束:
- 字母必须始终按字母顺序排列(
ABC,而不是CBA;组合,而不是排列) - 字符串的长度必须是 n 字母(允许算法在给定长度下跳出任何循环)
- 字母不能重复(
A,不是AA)
如何在 PHP 中最有效地生成这个数组?
换句话说,我如何避免暴力循环遍历所有可能的组合并过滤掉那些不符合上述规则的组合?
如果我的字母表只包含 3 个字母 — $alphabet = range('a','c'); — 我希望输出一个包含 7 个项目 (3C1+3C2+3C3) 的数组:[A,B,C,AB,AC,BC,ABC]。
如果我的字母表只包含 4 个字母 — $alphabet = range('a','d'); — 我希望输出一个包含 15 个项目 (4C1+4C2+4C3+4C4) 的数组:[A,B,C,D,AB,AC,AD,BC,BD,CD,ABC,ABD,ACD,BCD,ABCD]。但如果我只想限制字符串 <= 3 字母长,那么我会忽略 ABCD 导致只有 14 个项目 (4C1+4C2+4C3)。
$alphabet = range('a','z');
print_r(generate_strings($alphabet,1));
// expected output: A,B,C,...Z
print_r(generate_strings($alphabet,2));
// expected output: A..Z, AB..AZ, BC..BZ, CD, ..YZ
print_r(generate_strings($alphabet,3));
// expected output: A..Z, AB..YZ, ABC..XYZ
print_r(generate_strings($alphabet,10));
// expected output: A .. JKLMN .. AGKQRZ .. QRSTUVWXYZ
// ^ ^ ^10 character max, no repeats
// | still alphabetical order
// alphabetical order
function generate_strings($alphabet,$max_word_length) {
// how can I efficiently generate this array
// without brute force looping through all of
// the invalid and duplicate items like AA and CBA?
return $array_of_all_possible_strings;
}
【问题讨论】:
-
那么this question呢?
-
@MarkBaker 该问题涉及排列(即 aaa 是有效的)。这个问题是关于组合的。我可以强制所有排列,然后过滤组合,但我希望第一次跳过所有无效组合。
-
如果存在重复,为什么不直接强制排列并且不将其添加到最终结果数组中?例如,计算
AA字符串,获取每个字符的计数,如果 > 1 则不要将其添加到输出中,本质上只是检查有效性。至少您不必为有效性检查第二次循环。 -
无论哪种方式,我都必须遍历许多无效选项。我宁愿完全跳过处理无效选项。
-
嗯,我的第一个想法是递归解决方案,但我希望有人想出一个更聪明的解决方案。
标签: php arrays algorithm recursion