【问题标题】:How do I create a permutation of a string (10 characters long or more)?如何创建字符串的排列(10 个字符长或更多)?
【发布时间】:2012-03-03 12:36:48
【问题描述】:

我有一个任务让我有点抓狂,有一个处理单词排列的部分,我浏览互联网后发现了一个做排列的函数,如下所示:

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 个或更多字符的排列吗?

【问题讨论】:

  • 您正在尝试做一个简单的随机字符串生成器?因为如果是的话,我已经创建了一个,所以我可以发送给你......
  • Permutation for string in php 的可能重复项
  • 在整数中,您尝试创建一个由 400 万个字符串组成的数组,每个字符串包含 10 个字符。那是 40 兆字节加上开销。错误消息说有大约 130 兆字节的限制。因此,对于开销而言,您想要的输出太大听起来似乎是合理的。计算一些不同的东西(一次生成一个排列而不是一次全部?)或增加你的限制。
  • #Frederick:为什么不呢,请发给我。谢谢,。 #nickb:同样...

标签: php algorithm anagram


【解决方案1】:

长度为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

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

【讨论】:

  • "长度为N 的字符串的排列数是N!" 应该提到,这仅适用于字符串的所有字符都是不同的。如果有重复,那就有点复杂了。
  • 太棒了.. 感谢 Kolink,+1 4 u :)
  • 如果此答案回答了您的问题,请将其标记为已接受 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-13
  • 2011-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-12
相关资源
最近更新 更多