この問題に対する単純な再帰アルゴリズムを作成できます。
アルゴリズムの考え方は、2 進数を見て0
、文字が同じままであることを1
意味し、アスタリスクに変わることを意味することがわかります。これを文字ごとに行うと、4 文字の長さの単語があるため、2*2*2*2 = 16
順列が得られます。
アルゴリズムは単語内の文字を調べ、文字ごとに通常の文字とアスタリスクとして順列を生成しようとします。help
結果は、各文字がそのままであるか、アスタリスクで覆われている場合の単語のすべての順列です。
function asterisk_permutations($str, &$result=array(), $i=0) {
if ($i >= strlen($str)) {
$result[] = $str;
return;
}
asterisk_permutations($str, $result, $i+1);
asterisk_permutations(substr_replace($str, '*', $i, 1), $result, $i+1);
}
asterisk_permutations("help", $result);
var_dump($result);
出力は次のとおりです。
array(16) {
[0]=> string(4) "help"
[1]=> string(4) "hel*"
[2]=> string(4) "he*p"
[3]=> string(4) "he**"
[4]=> string(4) "h*lp"
[5]=> string(4) "h*l*"
[6]=> string(4) "h**p"
[7]=> string(4) "h***"
[8]=> string(4) "*elp"
[9]=> string(4) "*el*"
[10]=> string(4) "*e*p"
[11]=> string(4) "*e**"
[12]=> string(4) "**lp"
[13]=> string(4) "**l*"
[14]=> string(4) "***p"
[15]=> string(4) "****"
}