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中路径问题的解决方案
Oct 09 PHP
PHP 杂谈《重构-改善既有代码的设计》之三 重新组织数据
Apr 09 PHP
PHP实现Soap通讯的方法
Nov 03 PHP
php字符串替换函数substr_replace()用法实例
Mar 17 PHP
php通过修改header强制图片下载的方法
Mar 24 PHP
了解PHP的返回引用和局部静态变量
Jun 04 PHP
php反射类ReflectionClass用法分析
May 12 PHP
PHP目录操作实例总结
Sep 27 PHP
浅谈PHP安全防护之Web攻击
Jan 03 PHP
PHP处理Ajax请求与Ajax跨域问题
Feb 13 PHP
PHP判断是手机端还是PC端 PHP判断是否是微信浏览器
Mar 15 PHP
在laravel框架中实现封装公共方法全局调用
Oct 14 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
国产动画《伍六七》原声大碟大卖,啊哈娱乐引领音乐赋能IP的新尝试
2020/03/08 国漫
php文字水印和php图片水印实现代码(二种加水印方法)
2013/12/25 PHP
采用thinkphp自带方法生成静态html文件详解
2014/06/13 PHP
ThinkPHP令牌验证实例
2014/06/18 PHP
对xmlHttp对象的理解
2011/01/17 Javascript
javascrpt绑定事件之匿名函数无法解除绑定问题
2012/12/06 Javascript
实现51Map地图接口(示例代码)
2013/11/22 Javascript
JS脚本根据手机浏览器类型跳转WAP手机网站(两种方式)
2015/08/04 Javascript
node.js入门实例helloworld详解
2015/12/23 Javascript
基于Angularjs实现分页功能
2016/05/30 Javascript
利用JS判断鼠标移入元素的方向
2016/12/11 Javascript
利用Ionic2 + angular4实现一个地区选择组件
2017/07/27 Javascript
javascript将非数值转换为数值
2018/09/13 Javascript
vue中过滤器filter的讲解
2019/01/21 Javascript
JavaScript JMap类定义与使用方法示例
2019/01/22 Javascript
vue3.0中使用element的完整步骤
2021/03/04 Vue.js
[05:15]DOTA2英雄梦之声_第16期_灰烬之灵
2014/06/21 DOTA
Python操作MySQL简单实现方法
2015/01/26 Python
Python的Django框架中的Context使用
2015/07/15 Python
详解Python 切片语法
2019/06/10 Python
Python+selenium点击网页上指定坐标的实例
2019/07/05 Python
解决Pycharm中恢复被exclude的项目问题(pycharm source root)
2020/02/14 Python
Python中的xlrd模块使用原理解析
2020/05/21 Python
浅谈keras2 predict和fit_generator的坑
2020/06/17 Python
python类共享变量操作
2020/09/03 Python
关于PySnooper 永远不要使用print进行调试的问题
2021/03/04 Python
软件配置管理有什么好处
2015/04/15 面试题
优秀求职信范文分享
2013/12/19 职场文书
syb养殖创业计划书
2014/01/09 职场文书
小学标准化建设汇报材料
2014/08/16 职场文书
工作失职检讨书(精华篇)
2014/10/15 职场文书
群众路线教育实践活动整改落实情况汇报
2014/10/28 职场文书
2014年党支部工作总结
2014/11/13 职场文书
自荐信怎么写
2015/03/04 职场文书
高老头读书笔记
2015/06/30 职场文书
源码分析Redis中 set 和 sorted set 的使用方法
2022/03/22 Redis