【问题标题】:Swap every pair of characters in string交换字符串中的每一对字符
【发布时间】:2008-10-12 09:45:39
【问题描述】:

我想获取字符串交换字符对的所有排列。例如:

基本字符串:abcd

组合:

  1. bacd
  2. acbd
  3. abdc

等等

编辑

我只想交换彼此相邻的字母。就像第一和第二,第二和第三,但不是第三和第六。

最好的方法是什么?

编辑

只是为了好玩:有三四个解决方案,有人可以发布一个速度测试,以便我们比较哪个最快?

速度测试

我对 nickf 的代码和我的代码进行了速度测试,结果是我的 nickf 以 4 个字母(0.08 和 0.06 10K 次)击败了 nickf,但 nickf 以 10 个字母击败了它(nick 的 0.24 和我的 0.37)

【问题讨论】:

标签: php string


【解决方案1】:

编辑:Markdown 今天讨厌我...

$input = "abcd";
$len = strlen($input);
$output = array();

for ($i = 0; $i < $len - 1; ++$i) {
    $output[] = substr($input, 0, $i)
              . substr($input, $i + 1, 1)
              . substr($input, $i, 1)
              . substr($input, $i + 2);
}
print_r($output);

【讨论】:

  • 这并没有给出所有可能的版本,不是吗?除非我误解了 OP 的问题。
  • HoboBen iment 只交换相邻的字母。比如第一和第二,第二和第三,但不是第三和第六。
【解决方案2】:

nickf 做了漂亮的解决方案谢谢,我想出了不太漂亮的:

  $arr=array(0=>'a',1=>'b',2=>'c',3=>'d');
  for($i=0;$i<count($arr)-1;$i++){
  $swapped="";
  //Make normal before swapped
  for($z=0;$z<$i;$z++){
   $swapped.=$arr[$z];
  }
  //Create swapped
  $i1=$i+1;
  $swapped.=$arr[$i1].$arr[$i];

  //Make normal after swapped.     
  for($y=$z+2;$y<count($arr);$y++){
  $swapped.=$arr[$y];

  }
$arrayswapped[$i]=$swapped;
}
var_dump($arrayswapped);

【讨论】:

    【解决方案3】:

    【讨论】:

      【解决方案4】:

      仅使用以下内容怎么样:

      function swap($s, $i)
      {
        $t = $s[$i];
        $s[$i] = $s[$i+1];
        $s[$i+1] = $t;
      
        return $s;
      }
      
      $s = "abcd";
      $l = strlen($s);
      for ($i=0; $i<$l-1; ++$i)
      {
        print swap($s,$i)."\n";
      }
      

      【讨论】:

      • 为什么要让那个函数通过引用改变字符串,只是为了把它改回来?为什么不直接进行更改并返回新字符串?
      • 我试图变得聪明并避免创建字符串。然而,这是一种过早的优化,在大多数情况下可能是无用的。另外,我几乎不知道 PHP(或其内存模型),所以我实际上不知道它是否是一种优化。我现在改了;感谢您的评论。
      【解决方案5】:

      这是一个稍微快一点的解决方案,因为它不会过度使用 substr()。

      function swapcharpairs($input = "abcd") {
        $pre = "";
        $a="";
        $b = $input[0];
        $post = substr($input, 1);
        while($post!='') {
          $pre.=$a;
          $a=$b;
          $b=$post[0];
          $post=substr($post,1);
          $swaps[] = $pre.$b.$a.$post;
        };
        return $swaps;
      }
      
      print_R(swapcharpairs());
      

      【讨论】:

        猜你喜欢
        • 2015-08-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多