Php 如何创建字符串的排列(10个字符或更长)?

Php 如何创建字符串的排列(10个字符或更长)?,php,algorithm,anagram,Php,Algorithm,Anagram,我接到一个让我有点疯狂的任务,有一个关于单词排列的部分,在我浏览互联网后,我找到了一个进行排列的函数,如下所示: function permute($str) { if (strlen($str) < 2) { return array($str); } $permutations = array(); $tail = substr($str, 1); foreach (permute($tail) as $permutation)

我接到一个让我有点疯狂的任务,有一个关于单词排列的部分,在我浏览互联网后,我找到了一个进行排列的函数,如下所示:

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;
}
问题是,此函数只能执行9个字符的所有排列(大约362880个组合,时间较长,使浏览器无法响应tinytime)。尝试执行最多10个字符的排列时,将显示一条错误消息:

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


您有没有解决方案或其他方法来进行长度为10个字符或以上的排列?

长度为
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));
}
如果您试图对所有
N排列,请尝试:

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

如果这些都不能回答您的问题,请澄清;)

长度为
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));
}
如果您试图对所有
N排列,请尝试:

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

如果这些都不能回答您的问题,请澄清;)

你想做一个简单的随机字符串生成器?因为如果是的话,我已经创建了一个,所以我可以将它发送给您…可能是整数的重复,您正在尝试创建一个由400万个字符串组成的数组,每个字符串包含10个字符。这是40兆字节加上开销。错误消息说有一个大约130兆字节的限制。因此,就开销而言,您想要的输出似乎太大了。计算不同的东西(一次生成一个排列,而不是一次生成所有排列?)或增加您的限制。可能重复的#弗雷德里克:为什么不,请发送给我。谢谢#尼克:是一样的……)#大流士:多亏了信息。。这很有帮助#阿维纳什:这是另一种方式,很有帮助。。谢谢你想做一个简单的随机字符串生成器?因为如果是的话,我已经创建了一个,所以我可以将它发送给您…可能是整数的重复,您正在尝试创建一个由400万个字符串组成的数组,每个字符串包含10个字符。这是40兆字节加上开销。错误消息说有一个大约130兆字节的限制。因此,就开销而言,您想要的输出似乎太大了。计算不同的东西(一次生成一个排列,而不是一次生成所有排列?)或增加您的限制。可能重复的#弗雷德里克:为什么不,请发送给我。谢谢#尼克:是一样的……)#大流士:多亏了信息。。这很有帮助#阿维纳什:这是另一种方式,很有帮助。。感谢“长度为
N
的字符串的排列数是
N!
”应该提到的,这仅适用于字符串的所有字符都不同的情况。如果有重复的就有点复杂了太棒了。。感谢Kolink,+1 4 u:)如果此答案回答了您的问题,请将其标记为已接受:)“长度
N
的字符串的排列数是
N!
”应该已经提到,这仅适用于字符串的所有字符都是不同的情况。如果有重复的就有点复杂了太棒了。。谢谢Kolink,+1 4 u:)如果此答案回答了您的问题,请将其标记为已接受:)