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


Algorithm to mix any list of string (array)

我需要找出在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.

这个问题不同于在PHP中查找数组的子集,因为这个问题需要数组的所有组合到一定长度,而不是数组的所有排列到一定长度。特别是,链接的问题例如永远不会返回"11"或"332",而这个问题也希望得到这些值作为输出。

这个问题可以通过编写一个递归函数来解决,在这个递归函数中,您可以根据较短长度的组合数组创建一个具有一定长度的组合的数组。对于长度为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 ) ) );

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