Zamienić każdą parę znaków w łańcuchu

głosy
3

Chciałbym uzyskać wszystkie permutacje zamienione znaki parami sznurku. Na przykład:

Ciąg bazowy: abcd

kombinacje:

  1. bacd
  2. acbd
  3. abdc

itp.

Edytować

Chcę zamienić tylko litery, które są obok siebie. Podobnie jak pierwszy z drugim, drugi z trzecim, ale nie trzeci z szóstym.

Jaki jest najlepszy sposób to zrobić?

Edytować

Tak dla zabawy: Istnieją trzy lub cztery rozwiązania, mógłby ktoś opublikować test tych prędkości, więc możemy porównać, który jest najszybszy?

Test prędkości

Zrobiłem test kodu nickf i kopalni prędkości, a wyniki są takie, że kopalnia jest pokonując nickf pod adresem czterech liter (0,08 i 0,06 za 10K razy), ale nickf się bije go na 10 liter (Nicka 0,24 i 0,37 min)

Utwórz 12/10/2008 o 10:45
źródło użytkownik
W innych językach...                            


5 odpowiedzi

głosy
2

Edit: Markdown nienawidzi mnie dzisiaj ...

$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);
Odpowiedział 12/10/2008 o 11:00
źródło użytkownik

głosy
1

Szybkie wyszukiwanie w Google dał mi, że:

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

Odpowiedział 12/10/2008 o 11:25
źródło użytkownik

głosy
1

nickf wykonane piękne rozwiązanie dziękuję, wymyśliłem mniej piękne:

  $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);
Odpowiedział 12/10/2008 o 11:24
źródło użytkownik

głosy
0

Oto nieco szybciej rozwiązanie jako nie nadużywania 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());
Odpowiedział 12/10/2008 o 18:28
źródło użytkownik

głosy
0

Jak o właśnie przy użyciu następujących:

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";
}
Odpowiedział 12/10/2008 o 11:49
źródło użytkownik

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more