输出字符串的所有组合可能

题目

输出一个字符串所有可能的组合,如"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);
posted @ 2020-08-12 10:49  whyly  阅读(448)  评论(0编辑  收藏  举报