我想获得字符串交换字符对的所有排列。例如:
基本字符串:abcd
组合:
bacd
acbd
abdc
等
我想只交换彼此相邻的字母。就像第一次用第二次,第二次用第三次,但不是第三次用第六次。
最好的方法是什么?
只是为了好玩:有三到四个解决方案,有人可以对这些解决方案进行速度测试,以便我们比较哪个最快?
我对nickf的代码和我的代码进行了速度测试,结果是我的四个字母(0.08和0.06,10K次)击败了nickf's,但是nickf以10个字母击败它(缺口0.24和我的0.37)
答案 0 :(得分:3)
编辑: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 :(得分:1)
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);
答案 2 :(得分:1)
答案 3 :(得分:0)
如何使用以下内容:
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";
}
答案 4 :(得分:0)
这是一个稍微快一点的解决方案,因为它没有过度使用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());