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**

ETC...

我正在努力任何想法都会受到赞赏?

谢谢

4

3 回答 3

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 回答
1

你可以为这个问题编写一个简单的递归算法。

该算法的想法是,您可以查看二进制数,并看到 a0表示字符将保持不变,并且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 回答
0

一个简单的方法是:

  1. 填充 bincode 所以 0 => 0000

  2. 循环 bincode,如果 bincode[n] = 0,则将 word[n] 替换为 *。

于 2012-06-17T18:27:01.807 回答