混合任何字符串列表(数组)的算法

时间:2014-07-27 12:52:56

标签: php arrays string algorithm

我需要找出在php中生成数组所有组合列表的最佳算法。

我想要原始数组中所有可能的元素组合。重复的问题只需要排列。不同之处在于我想要包括,例如,“22”,而“22”不在此数组的排列数组中的元素中。

以下是一个例子:

Input : 1, 2, 3

然后输出

Output : 1, 2, 3, 11, 12, 13, 21, 22, 23, 31, 32, 33, 111, 112, 113, 121, 123 ... until 333.

这个问题与Finding the subsets of an array in PHP不同,因为这个问题要求数组的所有组合达到一定长度,而不是阵列的所有排列达到一定长度。特别是,链接的问题将永远不会返回“11”或“332”,而此问题也希望将这些值作为输出。

1 个答案:

答案 0 :(得分:2)

这个问题可以通过编写一个递归函数来解决,在这个函数中,你可以根据较短长度组合的数组创建一个组合长达一定长度的数组。有一个长度为1的特殊情况。在这种情况下,组合数组与原始数组相同。对于所有其他长度,我们计算最多比当前长度小1的字符串的组合数组,并添加当前长度的所有组合。

function combi( $arr, $length ) {
  if( $length == 1 ) {
    return $arr;
  } else {
    $shorter = combi( $arr, $length - 1 );

    $new = Array();
    foreach( $shorter as $prefix ) {
      if( strlen( $prefix ) == $length - 1 ) {
        foreach( $arr as $suffix ) {
          $new[] = $prefix . $suffix;
        }
      }
    }

    return array_merge( $shorter, $new );
  }
}

$a = Array( "1", "2", "3" );

var_dump( combi( $a, count( $a ) ) );

这可能不是最快的方法,因为您将循环遍历不断增长的列表,而大多数元素与生成新字符串无关。除此之外,如果你的输入不是一个字符串数组,你最终得到一个混合的字符串数组,无论你开始使用什么类型的元素。

This ideone显示此代码有效。