Поменяйте местами каждую пару символов в строке - PullRequest
4 голосов
/ 12 октября 2008

Я хотел бы получить все перестановки пар символов в строке с заменой. Например:

Базовая строка: abcd

Комбинация:

  1. bacd
  2. acbd
  3. abdc

и т.д.

Редактировать

Я хочу поменять местами только буквы, которые находятся рядом друг с другом. Как первый со вторым, второй с третьим, но не третий с шестым.

Какой лучший способ сделать это?

Редактировать

Просто для удовольствия: есть три или четыре решения, может кто-нибудь опубликовать тест скорости, чтобы мы могли сравнить, какое из них самое быстрое?

Тест скорости

Я сделал тест скорости и кода Никфа и мой, и результаты таковы, что мой бьет по Никфу в четыре буквы (0,08 и 0,06 по 10K раз), но Никф бьет по 10 букв (0,24 Ника и 0,37 мой) *

Ответы [ 5 ]

3 голосов
/ 12 октября 2008

Редактировать: 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);
1 голос
/ 12 октября 2008

Быстрый поиск в Google дал мне, что:

http://cogo.wordpress.com/2008/01/08/string-permutation-in-php/

1 голос
/ 12 октября 2008

Никф сделал красивое решение, спасибо, я придумал менее красивое:

  $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);
0 голосов
/ 12 октября 2008

Вот немного более быстрое решение, так как его не злоупотребляет 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());
0 голосов
/ 12 октября 2008

Как насчет использования следующего:

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";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...