【问题标题】:php string permutationphp字符串排列
【发布时间】:2011-10-05 17:35:06
【问题描述】:

假设我有一个由这些范围“a-zA-Z0-9”中的字符组成的数组。我想要做的是在 4 个字母范围内获得所有可能的组合。字符可以在字符串中重复。我正在寻找一种蛮力的方式来做到这一点。

这就是我认为的迭代方式:

“啊啊” “aaab” “啊啊啊” ... “9999”

【问题讨论】:

  • 考虑重新表述您的整个问题,以便您真正提出问题
  • 这似乎是一个非常奇怪的目标。也许如果我们有一些上下文,我们可以更好地帮助您解决问题。
  • 你需要的答案可以在here找到
  • 您是指严格数学意义上的“排列”,还是只想从给定字母表中找到所有可能的三字母单词?澄清一下,如果你的字母表是“abcde”,那么严格来说,“aaa”不是一个排列,因为排列不重复一个元素。同样在数学方面,排列不同于组合——排列中的顺序很重要,因此“abc”和“cba”是不同的排列,但代表相同的组合。
  • 这个问题来自XY problemoverall goal 是什么?

标签: php permutation


【解决方案1】:

以蛮力方式:

$chars = array_merge(range('0', '9'), range('a', 'z'), range('A', 'Z'));
$cnt = count($chars);
$strings = array();
for ($first = 0; $first < $cnt; $first++) {
   for ($second = 0; $second < $cnt; $second++) {
       for ($third= 0; $third< $cnt; $third++) {
           for ($fourth= 0; $fourth < $cnt; $fourth++) {
              $strings[] = $chars[$first] . $chars[$second] . $chars[$third] . $chars[$fourth];
           }
       }
   }
}

你最终会得到一个 honkin' 大数组,所以你可能想在其中一个循环中加入一些数据库操作,这样 $strings 就不会变得太大并通过达到内存限制来终止你的脚本。

【讨论】:

    【解决方案2】:

    要随机访问,您可以使用 base_convert:

    function getHash($i)
    {
      //- allowed Letters
      $letters = 'aAbBcCdDeEfFgG';
      $len = strlen($letters);
    
      //- convert $i to base of $letters
      $i_in_base_of_letter = base_convert($i, 10, $len);
    
      //- replace letters
      return strtr($i_in_base_of_letter, '0123456789abcdefghijklmnopqrstuvwxyz', $letters);
    
    }
    

    如果你的基地大于 36(你有超过 36 个字符),则为 manuel

    function getHash($i)
    {
      //- allowed Letters
      $letters = 'aAbBcCdDeEfFgG';
      $letters_arr = str_split($letters, 1);
    
      $len = strlen($letters);
    
      $out ='';
    
      if ($i>0)
      {
        while ($i>0)
        {
          $r = $i % $len;
          $out = $letters_arr[$r] . $out;
          $i = floor ($i / $len);
        }
        return $out;
      }
      else
      {
        return $letters_arr[0];
      }
    }
    

    你可以使用迭代:

    for($i=0; $i<100; $i++)
    {
      echo getHash($i) ."\n";
    }
    

    这种方法没有蛮力方法那么快。

    问候托马斯

    【讨论】:

      猜你喜欢
      • 2011-12-29
      • 1970-01-01
      • 2014-10-19
      • 1970-01-01
      • 2011-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多