PHP脚本查找所有可能的字符串组合

时间:2015-06-15 19:28:09

标签: php

我写了一个php脚本来查找适合特定模板的所有组合。

要求是:

1)查找使用这些字符的所有组合:

" 2"," 3"," 4"," 6"," 7",&# 34; 8"," 9"," Q"," W"," R"," T&#34 ;," Y"," P"," D"," F"," G",&#34 ; H"," J"," K"," X"," C"," V" ," B"," M"

2)每个条目包含5个段中的25个字符,用连字符分隔。

例如。 XXXXX-XXXXX-XXXXX-XXXXX-XXXXX

3)每个段不能包含5个相同的字符

XXXXX-BBBBB ......错误

XXXXB-BBBBM ......好

我在PHP中编写了这个脚本,但由于内存不足而无法正常工作。我想改进这个脚本,也许翻译成另一种语言。

<?php
set_time_limit(0);
$input = array("2", "3", "4", "6", "7", "8", "9", "Q", "W", "R", "T", "Y", "P", "D", "F", "G", "H", "J", "K", "X", "C", "V", "B", "M");
$length = 5;

function permut($input, $pos, $maxSame = null)
{
    $len = 1;
    $list = array();
    $listTemp = $input;
    foreach ($input as $fill) {
        while ($len < $pos) {
            $listNew = $listTemp;
            foreach ($input as $part) {
                foreach ($listNew as $p) {
                    $tmpNew = $p . $part;
                    $listTemp[] = $tmpNew;
                    if (strlen($tmpNew) == $pos) {
                        if ($maxSame == null)
                            $list[] = $tmpNew;
                        else {
                            $tmpSplit = str_split($tmpNew);
                            $tmpValues = array_count_values($tmpSplit);
                            $addToArray = true;
                            foreach ($tmpValues as $value) {
                                if ($value >= $maxSame) {
                                    $addToArray = false;
                                }
                            }

                            if ($addToArray)
                                $list[] = $tmpNew;
                        }

                        if (count($list) % 1000 == 0)
                            echo count($list) . "\n";
                    }
                }
            }
            $len++;
        }
    }
    //print_r($list);
}

permut($input, $length);
?>

2 个答案:

答案 0 :(得分:0)

您可以间歇性地将数据输出到文件中,以便内存不会溢出

答案 1 :(得分:0)

这里有两个明显的子问题可以解决:

  1. 您想要查找给定字符集的所有非重复的5个字符组合
  2. 您想要找到这些字符串的所有5个字符串组合。
  3. 首先让我们计算#1的组合数量,假设你的组中有24个字符:

    24!/(5!*19!) - 24 = 42480
    

    每个5字节,占用大约200KB的存储空间,给予或接受。还不错。

    那么#2呢?

    42480!/(5!*42475!) = 1152495015245732528496 or 1.1*10^21
    

    冷却。这将需要 28.81万亿千兆字节 。给予或接受。

    第二个想法,我认为这不值得使用地球上的大部分存储空间。

    编辑:我最初搞砸了数学,但现在已经修好了。

相关问题