PHP获取字符串的所有子集,获取子集 - vinci321的个人空间 - OSCHINA - 中文开源技术交流社区...

题目

给出一个集合,请输出该集合的所有子集,含空子集。

示例 1:

输入: [1,2,3]

输出: [[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]

解释:

1,迭代法

思路就是每一轮取一个元素,然后把它加入到已产生的子集中,产生新的子集

/**

* 获取一个集合的所有子集,包含空子集,不排序

* @param $arr array

* @return array 二维数组

*/

function getAllSub(array $arr) : array {

if (count($arr) <= 1) {

return $arr;

}

$result = [];

$result[] = []; //这里把空子集第一个放入,是为了在后续的遍历中,把每个单个成员放入其中,作为子集

foreach ($arr as $member) {

//对现有的结果遍历,将每个元素复制出来,再将新成员加入到其中,最后将它作为新元素加入到结果中

$count = count($result);

for ($i = 0; $i < $count; $i++) {

$newSub = $result[$i];

$newSub[] = $member;//加入新成员

$result[] = $newSub;//将新元素加入到结果中

}

}

return $result;

}

输入

$arr = ['a', 'b', 'c', 'd'];

$res = getAllSub($arr);

print_r($res);

输出

Array

(

[0] => Array

(

)

[1] => Array

(

[0] => a

)

[2] => Array

(

[0] => b

)

[3] => Array

(

[0] => a

[1] => b

)

[4] => Array

(

[0] => c

)

[5] => Array

(

[0] => a

[1] => c

)

[6] => Array

(

[0] => b

[1] => c

)

[7] => Array

(

[0] => a

[1] => b

[2] => c

)

[8] => Array

(

[0] => d

)

[9] => Array

(

[0] => a

[1] => d

)

[10] => Array

(

[0] => b

[1] => d

)

[11] => Array

(

[0] => a

[1] => b

[2] => d

)

[12] => Array

(

[0] => c

[1] => d

)

[13] => Array

(

[0] => a

[1] => c

[2] => d

)

[14] => Array

(

[0] => b

[1] => c

[2] => d

)

[15] => Array

(

[0] => a

[1] => b

[2] => c

[3] => d

)

)

时间复杂度: O(n^2)

2,位图法

思路就是用0/1位值来控制是否展示,所有情况都出现一次,则获取到所有子集。例如 0000 就表示所有都不展示,就是空子集,0001就表示 [d]。结果个数刚好是 2^4 = 16.

代码

/**

* 获取一个集合的所有子集,包含空子集,不排序

* @param $arr array

* @return array 一维数组

*/

function getAllSubByBit(array $arr) : array {

$count = count($arr);

if ($count <= 1) {

return $arr;

}

$arr = array_reverse($arr); //O(n) 主要是为了结果可读性,可注释

$result = [];

$total = pow(2, $count);

for ($i=0; $i

//把十进制转换为二进制字符串

$bitStr = decbin($i);

$bitLen = strlen($bitStr);

//从低位开始分别取出

$tmp = '';

for ($j=$count-1, $k=$bitLen-1; $j>=0 && $k>=0; $j--, $k--) { //O(n)

$letter = $arr[$j];

$bitNumber = $bitStr[$k];

$displayRes = $bitNumber == 1 ? $letter : ''; //位值为1则展示,否则为空字符串

$tmp .= $displayRes;

}

$result[] = $tmp;

}

return $result;

}

输入

$arr = ['a', 'b', 'c', 'd'];

$res = getAllSubByBit($arr);

print_r($res);

输出

Array

(

[0] =>

[1] => a

[2] => b

[3] => ab

[4] => c

[5] => ac

[6] => bc

[7] => abc

[8] => d

[9] => ad

[10] => bd

[11] => abd

[12] => cd

[13] => acd

[14] => bcd

[15] => abcd

)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值