字符串全排列

输入一个字符串,按字典序打印出该字符串中字符的所有排列。

例如,输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。

思路:

先确定第一个位置的字符 ,然后与后面的每一个字符进行交换,对所有的字符都这样处理,直到长度一样打印。

例子:abc
第一步(for循环):abc将第一个字符与自己本身还与其他的字符进行交换后得到abc、bac、cba
第二步(递归实现):在第一步每种情况的基础上,保持第一个字符不变,求剩余几位的排列。

以bac为例:保持第一位不变,剩余两位ac的排列为:ac、ca。

直到保存到只剩下一个字符没有交换后加上前面的不变的字符作为输出结果为:bac、bca。
 


/**
 * 字符串全排列
 * @param $str  string 字符串
 * @param $start integer 开始
 * @param $to    integer 遍历
 *
 * @return string
 */
function permutation($str,$start,$to){
    if($to < 1) {
        return '';
    }
    if($start == $to) {
        var_dump($str);
    }else{
        for($i = $start; $i<=$to; $i++) {
            swap($str,$start,$i);
            permutation($str,$start+1,$to);
            swap($str,$i,$start);
        }
    }

}
// 交换字符串中 两个值
function swap(&$str,$i,$j) {
    $tmp     = $str[$j];
    $str[$j] = $str[$i];
    $str[$i] = $tmp;
}

$str = 'abc';
permutation($str,0,strlen($str)-1);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值