【发布时间】:2012-08-23 01:18:27
【问题描述】:
我正在尝试生成一组字符串的所有可能组合,每个字符串最多使用一次。
- 未定义输出字符串的长度(最大长度是给定字符串的数量,因为您只能使用一次)
- 例如,字符串集
array('A','B')将生成 A,B,AB,BA。 - 例如,字符串集
array('ABC', 'Z')将生成“ABC”、“Z”、“ZABC”和“ABCZ”。 - 一个字符串集可以有相同的条目,并且输出不需要是唯一的。例如,字符串集
array('A', 'A')会生成'A'、'A'、'AA'、'AA'; (我实际上并不需要重复,但我不想让事情变得更困难)
我知道 2 个字符串有 4 种组合 (2=>4) 和 3=>15, 4=>64, 5=>325 ...
由于我不是程序员,我发现它至少“具有挑战性”。嵌套循环很快就太复杂了。一个更简单的解决方案可能是在带有字符串的数组的索引中找到一个模式。但这让我重复使用了字符串......
$strings = array('T','O','RS');
$num = 0;
$stringcount = count($strings);
$variations = array(0,1,4,15,64,325,1956,13699,109600,986409);
for($i=0;$i<$variations[$stringcount];$i++){
$index = base_convert($num, 10, $stringcount);
$array_of_indexes = str_split($index);
$out='';
for($j=0;$j<count($array_of_indexes);$j++){
$out .= $strings[$array_of_indexes[$j]];
}
echo $out . '<br />';
$num++;
}
结果: 吨 ○ RS 旧约 面向对象 口服补液盐 RST RSO RSRS OTT OTO OTRS OOT 噢噢噢 OORS
不好,很多重复+很多有效组合不包括在内
我知道这个解决方案在很多方面都是错误的,但我不知道从哪里开始?有什么建议?提前谢谢!
【问题讨论】:
-
我认为这些是排列,而不是组合。甚至可能没有。
-
在我看来,递归排列算法确实是一个很好的候选者,尽管结果是独立地包含每个原始字符串与“纯”排列略有不同。递归终止情况是当您只有两个元素时,递归部分将是第 n 个元素,然后是第 n+1 个和剩余元素的递归权限。不过要小心,因为置换计算可能会很快通过屋顶!祝你好运!
标签: php math combinations