PHP实现字符串的全排列详解


Posted in PHP onApril 24, 2019

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

例如,输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
思路:
1.利用递归形成递归树,达到深度优先,固定首字母的效果

2.得复位以后才能再次深度优先

3.回溯法思想

4.一张图和一个运行过程,只能慢慢体会了

<?phpfunction test($str,$start,&$res){    //递归终止条件

    if($start==strlen($str)){        $res[]=$str;        return;

    }  

    // 

    for($i=$start;$i<strlen($str);++$i){        if($i==$start || $str{$i}!=$str{$start}){

            swap($str,$i,$start);var_dump($str.'==='.$start);var_dump($res);sleep(1);

            test($str,$start+1,$res);

            swap($str,$i,$start);

        }  

   

    }  

    return $res;

}function swap(&$str,$a,$b){    

if(!is_string($str)) return;    

$t=$str{$a};    

$str{$a}=$str{$b};    

$str{$b}=$t;

}$str="abc";$res=array();//调用入口,从索引0开始

$res=test($str,0,$res);

var_dump($res);
string(7) "abc===0"array(0) {

}string(7) "abc===1"array(0) {

}string(7) "abc===2"array(0) {

}string(7) "acb===1"array(1) {

 [0]=> string(3) "abc"}string(7) "acb===2"array(1) {

 [0]=> string(3) "abc"}string(7) "bac===0"array(2) {

 [0]=> string(3) "abc"

 [1]=> string(3) "acb"}string(7) "bac===1"array(2) {

 [0]=> string(3) "abc"

 [1]=> string(3) "acb"}string(7) "bac===2"array(2) {

 [0]=> string(3) "abc"

 [1]=> string(3) "acb"}string(7) "bca===1"array(3) {

 [0]=> string(3) "abc"

 [1]=> string(3) "acb"

 [2]=> string(3) "bac"}string(7) "bca===2"array(3) {

 [0]=> string(3) "abc"

 [1]=> string(3) "acb"

 [2]=> string(3) "bac"}string(7) "cba===0"array(4) {

 [0]=> string(3) "abc"

 [1]=> string(3) "acb"

 [2]=> string(3) "bac"

 [3]=> string(3) "bca"}string(7) "cba===1"array(4) {

 [0]=> string(3) "abc"

 [1]=> string(3) "acb"

 [2]=> string(3) "bac"

 [3]=> string(3) "bca"}string(7) "cba===2"array(4) {

 [0]=> string(3) "abc"

 [1]=> string(3) "acb"

 [2]=> string(3) "bac"

 [3]=> string(3) "bca"}string(7) "cab===1"array(5) {

 [0]=> string(3) "abc"

 [1]=> string(3) "acb"

 [2]=> string(3) "bac"

 [3]=> string(3) "bca"

 [4]=> string(3) "cba"}string(7) "cab===2"array(5) {

 [0]=> string(3) "abc"

 [1]=> string(3) "acb"

 [2]=> string(3) "bac"

 [3]=> string(3) "bca"

 [4]=> string(3) "cba"}array(6) {

 [0]=> string(3) "abc"

 [1]=> string(3) "acb"

 [2]=> string(3) "bac"

 [3]=> string(3) "bca"

 [4]=> string(3) "cba"

 [5]=> string(3) "cab"}

PHP实现字符串的全排列详解

PHP 相关文章推荐
PHP调用三种数据库的方法(1)
Oct 09 PHP
在PHP中检查PHP文件是否有语法错误的方法
Dec 23 PHP
PHP获取当前日期所在星期(月份)的开始日期与结束日期(实现代码)
Jun 18 PHP
关于url地址传参数时字符串有回车造成页面脚本赋值失败的解决方法
Jun 28 PHP
php中stdClass的用法分析
Feb 27 PHP
PHP数组操作――获取数组最后一个值的方法
Apr 14 PHP
简单了解将WordPress中的工具栏移到底部的小技巧
Dec 31 PHP
thinkphp实现图片上传功能
Jan 13 PHP
PHP中PDO的事务处理分析
Apr 07 PHP
ThinkPHP实现图片上传操作的方法详解
May 08 PHP
深入理解Yii2.0乐观锁与悲观锁的原理与使用
Jul 26 PHP
PHP文件管理之实现网盘及压缩包的功能操作
Sep 20 PHP
PHP实现二维数组按照指定的字段进行排序算法示例
Apr 23 #PHP
Laravel5.0+框架邮件发送功能实现方法图文与实例详解
Apr 23 #PHP
一文掌握PHP Xdebug 本地与远程调试(小结)
Apr 23 #PHP
ThinkPHP3.2.3框架邮件发送功能图文实例详解
Apr 23 #PHP
PHP信号处理机制的操作代码讲解
Apr 19 #PHP
CentOS7编译安装php7.1的教程详解
Apr 18 #PHP
浅析PHP 中move_uploaded_file 上传中文文件名失败
Apr 17 #PHP
You might like
乐信RP2100的电路分析和打磨
2021/03/02 无线电
台湾中原大学php教程孙仲岳主讲
2008/01/07 PHP
php调用MySQL存储过程的方法集合(推荐)
2013/07/03 PHP
js限制checkbox勾选的个数以及php获取多个checkbbox的方法深入解析
2013/07/18 PHP
PHP 正则判断中文UTF-8或GBK的思路及具体实现
2013/11/26 PHP
PHP将MySQL的查询结果转换为数组并用where拼接的示例
2016/05/13 PHP
Yii2.0 Basic代码中路由链接被转义的处理方法
2016/09/21 PHP
关于Blog顶部的滚动导航条代码
2006/09/25 Javascript
jquery 插件 任意位置浮动固定层
2008/12/25 Javascript
基于jQuery的日期选择控件
2009/10/27 Javascript
JSON 数字排序多字段排序介绍
2013/09/18 Javascript
node.js学习总结之调式代码的方法
2014/06/25 Javascript
浅谈jquery.fn.extend与jquery.extend区别
2015/07/13 Javascript
如何用js 实现依赖注入的思想,后端框架思想搬到前端来
2015/08/03 Javascript
JS获取url参数、主域名的方法实例分析
2016/08/03 Javascript
微信小程序使用第三方库Underscore.js步骤详解
2016/09/27 Javascript
node.js中的事件处理机制详解
2016/11/26 Javascript
JavaScript验证知识整理
2017/03/24 Javascript
Vue框架中正确引入JS库的方法介绍
2017/07/30 Javascript
原生javascript实现文件异步上传的实例讲解
2017/10/26 Javascript
微信小程序实现banner图轮播效果
2020/06/28 Javascript
详解vue开发中调用微信jssdk的问题
2019/04/16 Javascript
echarts大屏字体自适应的方法步骤
2019/07/12 Javascript
基于js实现的图片拖拽排序源码实例
2020/11/04 Javascript
[40:04]Secret vs Infamous 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.23
2019/09/05 DOTA
Python实现二分法算法实例
2015/02/02 Python
Python三种遍历文件目录的方法实例代码
2018/01/19 Python
python简单实现矩阵的乘,加,转置和逆运算示例
2019/07/10 Python
Python程序暂停的正常处理方法
2019/11/07 Python
计算机专业个人求职自荐信
2013/09/21 职场文书
红领巾心向党演讲稿
2014/09/10 职场文书
班子成员四风问题自我剖析材料
2014/09/29 职场文书
2014流动人口计划生育工作总结
2014/12/20 职场文书
申报材料格式
2014/12/30 职场文书
2015年教研组工作总结
2015/05/04 职场文书
公司食堂管理制度
2015/08/05 职场文书