输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
思路:
1.利用递归形成递归树,达到深度优先,固定首字母的效果
2.得复位以后才能再次深度优先
3.回溯法思想
4.一张图和一个运行过程,只能慢慢体会了
<?php
function 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实现的更多相关文章

  1. 【算法与数据结构】Java实现字符串的全排列及组合

    注:本文记录了代码编写及调试过程,想直接浏览正确答案的请移步文章结尾. 一.字符串的全排列问题 1. 下面是最初的代码(答案有错误-重复输出) import java.util.Scanner; pu ...

  2. python3:实现字符串的全排列(无重复字符)

    最近在学一些基础的算法,发现我的数学功底太差劲了,特别是大学的这一部分,概率论.线性代数.高数等等,这些大学学的我是忘得一干二净(我当时学的时候也不见得真的懂),导致现在学习算法,非常的吃力.唉!不说 ...

  3. 28. 字符串的全排列之第2篇[string permutation with repeating chars]

    [本文链接] http://www.cnblogs.com/hellogiser/p/string-permutation-with-repeating-chars.html [题目] 输入一个字符串 ...

  4. 剑指Offer26 字符串的全排列

    /************************************************************************* > File Name: 26_String ...

  5. KMP替代算法——字符串Hash

    很久以前写的... 今天来谈谈一种用来替代KMP算法的奇葩算法--字符串Hash 例题:给你两个字符串p和s,求出p在s中出现的次数.(字符串长度小于等于1000000) 字符串的Hash 根据字面意 ...

  6. python3:实现字符串的全排列(有重复字符)

    抛出问题 求任意一个字符串的全排列组合,例如a='123',输出 123,132,213,231,312,321. 解决方案 #字符串任意两个位置字符交换 def str_replace(str, x ...

  7. python3实现字符串的全排列的方法(无重复字符)

    https://www.jb51.net/article/143357.htm 抛出问题 求任意一个字符串的全排列组合,例如a='123',输出 123,132,213,231,312,321.(暂时 ...

  8. LeetCode初级算法--字符串01:反转字符串

    LeetCode初级算法--字符串01:反转字符串 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.ne ...

  9. LeetCode初级算法--字符串02:字符串中的第一个唯一字符

    LeetCode初级算法--字符串02:字符串中的第一个唯一字符 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog. ...

随机推荐

  1. Pi的计算

    百度百科           圆周率用希腊字母 π(读作pài)表示,是一个常数(约等于3.141592654),是代表圆周长和直径的比值.它是一个无理数,即无限不循环小数.在日常生活中,通常都用3. ...

  2. mysql的一点小错误

    当使用sql语句时,字段记得使用``反向单引号,而不是单引号

  3. Linux下使用openVPN连接到某个内网

    推荐一个网站(比较全的介绍关于openvpn的客户端与服务端的配置) 点击我 此处我介绍我配置openvpn客户端连接的坑 我的机器为kali linux apt-get install openvp ...

  4. JS获取对象数据类型的方法

    1.typeof: 语法:typeof 对象 或者 typeof(对象) 返回对象的数据类型:只有原始数据类型:boolean number string undefined function obj ...

  5. NodeJs在windows上安装配置测试

    Node.js简介简单的说 Node.js 就是运行在服务端的 JavaScript.Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境.Node.js 使用了一个 ...

  6. Maven2-坐标

    什么是Maven坐标? 在生活中,每个城市,地点,都有自己独一无二的坐标,这样快递小哥才能将快递送到我们手上.类似于现实生活,Maven的世界也有很多城市,那就是数量巨大的构件,也就是我们平时用的ja ...

  7. DelphiXE10.2.3——跨平台生成验证码图片

    $("#img-code").bind( 'click', function () { $(this).attr('src','VerifyCode?t='+Math.random ...

  8. entity.Database.SqlQuery() 和entity.Database.SqlCommand()

    原文地址: http://msdn.microsoft.com/en-us/library/gg715124(v=vs.103) 使用 EF 4.1 或者更新版本, 你可以直接执行任何数据库命令. 在 ...

  9. 【病毒分析】对一个vbs脚本病毒的分析

    [病毒分析]对一个vbs脚本病毒的分析 本文来源:i春秋社区-分享你的技术,为安全加点温度 一.前言 病毒课老师丢给我们一份加密过的vbs脚本病毒的代码去尝试分析,这里把分析过程发出来,供大家参考,如 ...

  10. 数据结构图解(递归,二分,AVL,红黑树,伸展树,哈希表,字典树,B树,B+树)

    递归反转 二分查找 AVL树 AVL简单的理解,如图所示,底部节点为1,不断往上到根节点,数字不断累加. 观察每个节点数字,随意选个节点A,会发现A节点的左子树节点或右子树节点末尾,数到A节点距离之差 ...