给定字符串 ‘abcd’要求把这个字符串的任意组合方式全部打印出来,
实现这个算法用了三个方法一个比一个进步,
1:先分析这个事情是全排列,可能性是 432*1 = 24 所以可知第一个坑4个可能二个坑三个可能
2:循环处理四个坑
3:上方法
/**最终版
* @param string $s 这个是变化的字符串循环处理这个 从上一个方法的循环可以得到这个,当这个长度为1的时候应该是只是输出
* @param string $s2 这个是形成的字符串 应该是返回 $s2 . $s[1].$s[2]
*/
function three ($s, $s2 = '') {
$len = strlen($s);
if($len <= 1) {
echo $s2.$s.PHP_EOL;
} else {
for ($i = 0; $i< $len; $i++) {
$lin = str_replace($s[$i], '', $s);
three($lin, $s2.$s[$i]);
}
}
}
进阶版
function two ($s) {
$a1 = $a2 = $a3 = $a4 = $a5 = [];
for ($i = 0; $i<strlen($s); $i++) {
$a1[] = $s[$i];
}
foreach ($a1 as $k => $v) {
$a2 = $a1;
$str = $v;
unset($a2[$k]);
foreach ($a2 as $k1 => $v1) {
$a3 = $a2;
$str1 = $v1;
unset($a3[$k1]);
foreach ($a3 as $k2 => $v2) {
$a4 = $a3;
$str2 = $v2;
unset($a4[$k2]);
$str3 = array_pop($a4);
$a5[] = $str.$str1.$str2.$str3 ;
}
}
}
return $a5;
}
基础版
function one ($s) {
$a1 = $a2 = $a3 = [];
for ($i = 0; $i<strlen($s); $i++) {
$a1[] = $s[$i];
}
foreach ($a1 as $k => $v) {
$s1 = str_replace($v, '', $s);
for ($i = 0; $i < strlen($s1); $i++) {
$a2[] = $v.$s1[$i];
}
}
foreach ($a2 as $k => $v) {
$lin = [];
for ($j = 0; $j<strlen($v); $j++) {
$lin[] = $v[$j];
}
$s1 = str_replace($lin,'', $s);
for ($i = 0; $i < strlen($s1); $i++) {
$a3[] = $v.$s1[$i].str_replace($s1[$i], '', $s1);
}
}
return $a3;
}