1. 程式人生 > 實用技巧 >輸出字串的所有組合可能

輸出字串的所有組合可能

題目

輸出一個字串所有可能的組合,如"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);