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 相关文章推荐
利用Memcached在php下实现session机制 替换PHP的原生session支持
Aug 21 PHP
PHP支持多种格式图片上传(支持jpg、png、gif)
Nov 03 PHP
PHP获取网址的顶级域名函数代码
Sep 24 PHP
linux命令之调试工具strace的深入分析
Jun 03 PHP
php使用ICQ网关发送手机短信
Oct 30 PHP
利用PHP函数计算中英文字符串长度的方法
Nov 11 PHP
作为程序员必知的16个最佳PHP库
Dec 09 PHP
Yii2使用dropdownlist实现地区三级联动功能的方法
Jul 18 PHP
微信随机生成红包金额算法php版
Jul 21 PHP
PHP常用函数总结(180多个)
Dec 25 PHP
利用Laravel事件系统如何实现登录日志的记录详解
May 20 PHP
PHP判断一个数组是另一个数组子集的方法详解
Jul 31 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
PHP图片验证码制作实现分享(全)
2012/05/10 PHP
php 字符串中的\n换行符无效、不能换行的解决方法
2014/04/02 PHP
ThinkPHP之A方法实例讲解
2014/06/20 PHP
PHP多线程之内部多线程实例分析
2015/03/09 PHP
PHP的Yii框架的常用日志操作总结
2015/12/08 PHP
php基于openssl的rsa加密解密示例
2016/07/11 PHP
laravel学习教程之存取器
2016/07/30 PHP
javascript十个最常用的自定义函数(中文版)
2009/09/07 Javascript
javascript 验证日期的函数
2010/03/18 Javascript
JQuery分别取得每行最后一列和最后一行的示例代码
2013/08/18 Javascript
21个JavaScript事件(Events)属性汇总
2014/12/02 Javascript
javascript中获取元素标签中间的内容的实现方法
2016/10/08 Javascript
网页瀑布流布局jQuery实现代码
2016/10/21 Javascript
javascript滚轮事件基础实例讲解(37)
2017/02/14 Javascript
JS+DIV实现的卷帘效果示例
2017/03/22 Javascript
使用JS和canvas实现gif动图的停止和播放代码
2017/09/01 Javascript
微信小程序 如何引入外部字体库iconfont的图标
2018/01/31 Javascript
解决淘宝cnpm 安装后cnpm不是内部或外部命令的问题
2018/05/17 Javascript
使用Angular Cli如何创建Angular私有库详解
2019/01/30 Javascript
搭建一个Koa后端项目脚手架的方法步骤
2019/05/30 Javascript
使用localStorage替代cookie做本地存储
2019/09/25 Javascript
JavaScript arguments.callee作用及替换方案详解
2020/09/02 Javascript
python读取Excel实例详解
2018/08/17 Python
Python读取excel指定列生成指定sql脚本的方法
2018/11/28 Python
Tensorflow训练MNIST手写数字识别模型
2020/02/13 Python
python 图像增强算法实现详解
2021/01/24 Python
Hashtable 添加内容的方式有哪几种,有什么区别?
2012/04/08 面试题
编辑求职信样本
2013/12/16 职场文书
大学生军训自我鉴定
2014/02/12 职场文书
大学生先进事迹材料
2014/02/16 职场文书
学习雷锋月活动总结
2014/07/03 职场文书
有子女的离婚协议书怎么写(范本)
2014/09/29 职场文书
2015年母亲节寄语
2015/03/23 职场文书
企业宣传语大全
2015/07/13 职场文书
单位领导婚礼致辞
2015/07/28 职场文书
Redis高级数据类型Hyperloglog、Bitmap的使用
2021/05/24 Redis