PHP:字母排列

标签 php algorithm

<分区>

我的作业很难:

该列表包含按字母顺序排列的所有字符串,这些字符串可以形成字母 A-K。列表的开头如下所示:

  • ABCDEFGHIJK,
  • ABCDEFGHIKJ,
  • ABCDEFGHJIK,
  • ABCDEFGHJKI, ...

列表中的第三个字符串是 ABCDEFGHJIK。列表 n 的字符串是什么?

我已经编写了解决问题的代码,但只是 N 值在 60​​0 000 - 700 000 之间。当我尝试用 700 000 解决任务时,我得到“ fatal error :允许的内存大小为 134217728 字节耗尽”。而这就是任务的窍门,自动测试编号11是160万。所以一定有更简单的算法,但是我用搜索引擎找不到。那么什么是算法呢?我的代码是:

<?php
$number = $_REQUEST['n'];
$lettering = array("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K");

$counter = $number;
$done = permute($lettering, $counter);

echo $done[$number-1]."<br>";

function permute($array, $counter) {
    global $number;
    if(1 === count($array))
        return $array;
    $result = array();

    foreach($array as $key => $item)
        foreach(permute(array_diff_key($array, array($key => $item)), $counter) as $p){
            $result[] = $item.$p;
            $counter--;
            if($counter == 0) return $result;
        }
    return $result;
}

最佳答案

让我们看一下置换函数是如何定义的:

def permute(string):
  for each char in string
    sub <- remove char from string
    return concat(char, permute(sub))
end

对于长度为 L 的字符串, permute函数返回一个长度为 L! 的数组.因此我们可以看到以 char 开头的排列列表在索引 i在字符串中开始于 i*(L-1)!最终数组中的元素。

因此找到索引 N 处的排列,我们需要通过查找要附加的字符(由 N / (M - 1)! 给出的索引)及其相应的子字符串来迭代缩小我们的搜索空间。我们从字符串中删除这个字符,将其附加到结果中,然后用 N <- N % (M - 1)! 重复在子字符串上(这是该子字符串排列列表中的偏移索引)。

PHP代码:

function factorial($M) {
    $N = 1;
    for (;$M > 0;$M--)
        $N *= $M;
    return $N;
}
function remove_from_str($input, $index) {
   $str1 = substr($input, 0, $index);
   $str2 = substr($input, $index+1);
   return $str1.$str2;
}

function get_permutation($input, $N) {
   $L = strlen($input);
   $result = "";
   for ($M = $L; $M > 0; $M--) {
      $F = factorial($M-1);
      $j = intval(floor($N / $F));
      $result = $result.$input[$j];
      $input = remove_from_str($input, $j);
      $N = $N % $F;
   }
   return $result;
}

测试:

echo get_permutation("ABCDEFGHIJK", 1600000); // Outputs "AFEIGCDJKBH"

(注意:N 这里从 0 而不是 1 开始)

关于PHP:字母排列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45102750/

相关文章:

php - Apache 和 mysql 端口

javascript - 欧拉计划 qn 23

python - 在 Python 中比较两个几乎相同的 CSV 的最有效方法?

algorithm - 持久联合查找,偶尔删除

php - 与 PHP 的永久链接

php - 如何按自定义附加关系对模型进行排序

php - 如何使用 PHP 生成随机的 DARK 十六进制颜色代码?

php - 在 PHP 中将 MySQL 转换为 MySQLi

algorithm - 为什么比较是任何合理实现中的主要成本?

c - 有向图/网络中的随机游走