基于字符集的固定长度的所有字符串组合

时间:2011-10-23 01:28:30

标签: php math combinations

我正在寻找创建一个函数,它将使用字符集返回给定字符串长度内的每个可能的字符串。

例如,“abc”的字符集和2的长度应允许9(3 ^ 2)个唯一组合:

AA, AB, AC, BA, BB, 公元前, CA, CB, CC

(手动构建列表)

可以使用什么方法来创建这样的函数?

2 个答案:

答案 0 :(得分:2)

您已经 进行此操作,我们可以从您的示例解决方案中清楚地看到:

aa,ab,ac,ba,bb,bc,ca,cb,cc

你在脑子里做了什么来提出这个解决方案?你必须记住一些事情:

  1. 我应该从charset开始使用什么字符?

  2. 当我构建输出字符串时,来自charset的 next 字符是什么?

  3. 我可以从charset中挑选多少个字符?

  4. 当我从charset中挑选出我允许的所有字符时,我该怎么办?

  5. 关于我可以开始的字符我是否已经筋疲力尽了?如果是的话,我已经完成了。

  6. 你能把它翻译成代码吗?或者这个答案太可爱了?

答案 1 :(得分:2)

与往常一样,有多种方法可以解决您的要求,这只是一种方法,在输出字符串中每个字符使用一个计数器:

$c = "abc"; // charset
$l = 2; // string length

for($t='',$cl=strlen($c),$s=array_fill(0,$l,0),$i=pow($cl,$l);$a=0,$i--;) {
    for($t&&$t.=', ';$a<$l;$t.=$c[$s[$a++]]);
    for(;$a--&&++$s[$a]==$cl;$s[$a]=0);
};

echo $t; // the string you asked for.

aa,ab,ac,ba,bb,bc,ca,cb,cc

一个主循环,一个用于构建字符串的循环和一个用于计数的循环。

我可以想象这应该与输出字符串的每个位置获得模数一起工作。