题目
输出一个字符串所有可能的组合,如"abc",结果为['a', 'b', 'c', 'ab', 'ac', 'bc', 'abc'],不考虑字符顺序,ab和ba输出一种即可。
分析
可以采用递归算法,要计算"abc"的结果,可以考虑先计算"ab"的结果,在"ab"的结果基础上,再加入"c"
递归公式
f(abc) = f(ab) + f(ab)c + c
f(ab)c意思是把ab结果集中每个元素都添加c,最后在加入c本身,就是f(abc)的最终结果了
结束条件
当拆解到只有一个字符时,直接返回,比如['a']
function allStr($str) {
if (strlen($str) == 0) return [];
if (strlen($str) == 1) return [$str[0]];
$last = substr($str, -1);
$subArr = allStr(substr($str, 0, -1));
$rs = $subArr;
for ($i=0;$i<count($rs);$i++) {
$rs[$i] = "{$rs[$i]}{$last}";
}
array_push($rs, $last);
return array_merge($subArr, $rs);
}
$a = 'abcd';
$result = allStr($a);
print_r($result);