2012-02-11 51 views
0

我得到了一个任务,让我有点疯狂,有处理字排列的部分,之后我浏览互联网,我发现一个函数来完成排列,如下图所示:如何创建一个字符串(10个字符或更长)的排列?

function permute($str) { 
    if (strlen($str) < 2) { 
     return array($str); 
    } 
    $permutations = array(); 
    $tail = substr($str, 1); 
    foreach (permute($tail) as $permutation) { 
     $length = strlen($permutation); 
     for ($i = 0; $i <= $length; $i++) { 
      $permutations[] = substr($permutation, 0, $i) . $str[0] . substr($permutation, $i); 
     } 
    } 

    return $permutations; 
} 

这显示结果:

print_r(array_unique(permute("abcdefghi"))); // found 362880 
print_r(array_unique(permute("abcdefghij"))); // error 

的问题是,此功能仅能够执行的9个字符的所有置换(约362880点的组合,具有很长的时间,使浏览器不响应的tinytime)。当试图执行多达10个字符的排列,会出现一条错误消息:

致命错误:用尽134217728个字节允许内存大小(试图分配35个字节)

你有一个解决方案或另一种方式做10个或更多字符的排列?

+0

你试图做一个简单的随机字符串发生器?因为如果是的话,我已经创建了一个,所以我可以发送给你... – 2012-02-11 05:14:51

+1

可能重复[在PHP中的字符串排列](http://stackoverflow.com/questions/8130411/permutation-for-string-in- php) – nickb 2012-02-11 05:16:11

+0

在整数数字中,您试图制作一个由每个包含10个字符的400万个字符串组成的数组。这是40兆字节加上开销。错误消息说,有130兆字节的限制。所以在开销的情况下,你想要的输出太大了,这听起来似乎是合理的。计算不同的东西(一次产生一个排列,而不是一次产生排列?)或增加你的限制。 – 2012-02-11 05:20:44

回答

3

长度N的字符串置换的数量是N!

所以,如果你只是想找置换的数量,这会做:

function factorial($n) { 
    if($n == 0) return 1; 
    if($n < 3) return $n; 
    return $n*factorial($n-1); 
} 
function permute($str) { 
    return factorial(strlen($str)); 
} 

但是,如果你是试图让那些排列的随机一个,试试这个:

function permute($str) { 
    $l = strlen($str); 
    $a = str_split($str); 
    $ret = ""; 
    while($l > 0) { 
     $i = rand(0,$l-1); 
     $ret .= $a[$i]; 
     array_splice($a,$i,1); 
     $l--; 
    } 
    return $ret; 
} 

如果您尝试暴力破解所有N!排列,尝试:

ini_set("memory_limit",-1); 
set_time_limit(0); 
// your brute-force code here 

如果没有这些回答你的问题,请澄清;)

+0

“长度的字符串的排列数'N'是'N!'“应该提到,这只适用于字符串的所有字符都不相同的情况。如果有重复,这会更复杂一些。 – 2012-02-11 05:36:36

+0

真棒..感谢Kolink,+1 4你:) – Fredy 2012-02-11 06:09:53

+0

如果这个答案解答了你的问题,请将它标记为Accepted :) – 2012-02-11 07:30:11

相关问题