【问题标题】:All three word combinations (in the same order) from a string字符串中的所有三个单词组合(以相同的顺序)
【发布时间】:2013-11-08 05:15:54
【问题描述】:

假设我们有一个包含单词的字符串:
1 2 3 4 5

我想要三个单词的所有组合,但顺序不能改变。字符串的长度可以从 4 个单词到 7 个单词不等。不再是因为会有太多的组合。因此,示例 1 2 3 4 5 的结果将是一个带有字符串的数组:
1 2 3
1 2 4
1 2 5
1 3 4
1 3 5
1 4 5
2 3 4
2 3 5
2 4 5
3 4 5

我一直在考虑这个问题。一个想法是把它变成一个数组,为单词的数量生成一个二进制代码,如果它是 1,那么它会显示这个词,否则它不会(所以你会得到从 11100 到 00111 的任何东西)。但这可能不是最佳选择。

在这种情况下,速度很重要,因为可能需要在几分钟内完成数万次。

【问题讨论】:

    标签: php word permutation


    【解决方案1】:

    我使用了 Vicky 的答案并做了一些修改。 我认为这会按您的意愿工作

    function everyCombination($array) {
        $tempcount = 3;                            //lenght of the combinations you want
        $arrayCount      = count($array);
        $maxCombinations = pow($arrayCount, $arrayCount);
        $returnArray     = array();
        $conversionArray = array();
        foreach ($array as $key => $value) {
            $conversionArray[base_convert($key, 10, $arrayCount)] = $value;
        }
        for ($i = 0; $i < $maxCombinations; $i++) {
            $flag = 1;
            $combination = base_convert($i, 10, $arrayCount);
            $combination = str_pad($combination, $tempcount, "0", STR_PAD_LEFT);
            $temp = strtr($combination, $conversionArray);
            for($j = 0; $j < $tempcount-1; $j++){
    
                if($temp[$j] >= $temp[$j+1] || $flag == 0)
                    $flag = 0;
                else
                    $flag = 1;
            }
            if($flag && strlen($temp) == $tempcount)
                $returnArray[] = $temp;
        }
        return $returnArray;
    }
    
    print_r(everyCombination(array(1,2,3,4)));
    

    【讨论】:

    • 太棒了!我也查看了 Vicky 的答案,但我不知道如何调整它以使其正常工作。此解决方案有效。感谢 Vicky 的初始设置和 Bhavik 的最终解决方案!
    • 不...不行! :( 它只适用于数字。我在示例中发布了数字,因为这样更清楚。但我说的是字符串中的 WORDS...
    • 但这是什么意思,只有英文字母?我可以相应地调整功能。我试过everyCombination(array('a','b','c','d','e')),效果很好
    【解决方案2】:

    你可以这样做:

    <?php
    function everyCombination($array)
    {
        $arrayCount = count($array);
        $resultArray = array();
        $veryFinal = array();
        $maxCombinations = pow($arrayCount, $arrayCount);
        $returnArray = array();
        $conversionArray = array();
        foreach ($array as $key => $value) {
            $conversionArray[base_convert($key, 10, $arrayCount)] = $value;
        }
        for ($i = 0; $i < $maxCombinations; $i++) {
            $combination = base_convert($i, 10, $arrayCount);
            $combination = str_pad($combination, $arrayCount, "0", STR_PAD_LEFT);
            $returnArray[] = strtr($combination, $conversionArray);
        }
        $finalArray = array();
        foreach ($returnArray as $sepArray) {
            array_push($finalArray, array_unique(str_split($sepArray)));
        }
        foreach ($finalArray as $result) {
            $temp = implode(",", $result);
            if (count($result) == 3) {
                array_push($resultArray, $temp);
            }
        }
        $tempFinal = array_unique($resultArray);
        foreach ($tempFinal as $final) {
            array_push($veryFinal, $final);
        }
        return $veryFinal;
    }
    
    
    $res1 = (everyCombination(array(1, 2, 3, 4)));
    $res2 = (everyCombination(array('a','b','c','d')));
    var_dump($res1);
    var_dump($res2);
    

    它给了:

    array (size=24)
      0 => string '1,2,3' (length=5)
      1 => string '1,2,4' (length=5)
      2 => string '1,3,2' (length=5)
      3 => string '1,3,4' (length=5)
      4 => string '1,4,2' (length=5)
      5 => string '1,4,3' (length=5)
      6 => string '2,1,3' (length=5)
      7 => string '2,1,4' (length=5)
      8 => string '2,3,1' (length=5)
      9 => string '2,3,4' (length=5)
      10 => string '2,4,1' (length=5)
      11 => string '2,4,3' (length=5)
      12 => string '3,1,2' (length=5)
      13 => string '3,1,4' (length=5)
      14 => string '3,2,1' (length=5)
      15 => string '3,2,4' (length=5)
      16 => string '3,4,1' (length=5)
      17 => string '3,4,2' (length=5)
      18 => string '4,1,2' (length=5)
      19 => string '4,1,3' (length=5)
      20 => string '4,2,1' (length=5)
      21 => string '4,2,3' (length=5)
      22 => string '4,3,1' (length=5)
      23 => string '4,3,2' (length=5)
    array (size=24)
      0 => string 'a,b,c' (length=5)
      1 => string 'a,b,d' (length=5)
      2 => string 'a,c,b' (length=5)
      3 => string 'a,c,d' (length=5)
      4 => string 'a,d,b' (length=5)
      5 => string 'a,d,c' (length=5)
      6 => string 'b,a,c' (length=5)
      7 => string 'b,a,d' (length=5)
      8 => string 'b,c,a' (length=5)
      9 => string 'b,c,d' (length=5)
      10 => string 'b,d,a' (length=5)
      11 => string 'b,d,c' (length=5)
      12 => string 'c,a,b' (length=5)
      13 => string 'c,a,d' (length=5)
      14 => string 'c,b,a' (length=5)
      15 => string 'c,b,d' (length=5)
      16 => string 'c,d,a' (length=5)
      17 => string 'c,d,b' (length=5)
      18 => string 'd,a,b' (length=5)
      19 => string 'd,a,c' (length=5)
      20 => string 'd,b,a' (length=5)
      21 => string 'd,b,c' (length=5)
      22 => string 'd,c,a' (length=5)
      23 => string 'd,c,b' (length=5)
    

    【讨论】:

    • 这个解决方案改变了它不应该改变的 1,2,3 的顺序。例如它输出 311。但这不是它应该返回的组合(参见初始请求)。不过,感谢您的宝贵时间。
    猜你喜欢
    • 2017-01-08
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多