0

文字列のすべての可能性を生成するこのコードがあります

  <?PHP       
  for($i=0;$i< 16;$i++){

    echo decbin($i)."<br>";
  }
  ?>

これは印刷されます

0

1

10

11

100

101

110

111

1000

1001

1010

私が欲しいのは、このバイナリ データを 4 文字の文字列と組み合わせて、すべてを「*」に置き換えて、文字列「help」を入力すると、

help

hel*

he*p

he**

等...

私はどんなアイデアでも評価されるのに苦労していますか?

ありがとう

4

3 に答える 3

1

この問題に対する単純な再帰アルゴリズムを作成できます。

アルゴリズムの考え方は、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) "****"
}
于 2012-06-17T18:27:17.953 に答える
1

警告: 100% 未テスト

$s='help';
$l = strlen($s)-1;
for($i=0;$i<=$len;$i++){
  $bin=decbin($i);
  $newS = $s;
  foreach(str_split($bin) as $k=>$v) {
    if ($v) {
     $index = $l - $k;
     $newS[$index] = '*';
    }
  }

  echo $newS.'<br>';
}
于 2012-06-17T18:22:56.070 に答える
0

簡単なアプローチは次のとおりです。

  1. ビンコードをパディングするので 0 => 0000

  2. bincode をループし、bincode[n] = 0 の場合は word[n] を * に置き換えます。

于 2012-06-17T18:27:01.807 に答える