输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串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. Linux时间戳转换成BCD码(转载)

    #include <stdio.h> #include <stdlib.h> #include <time.h> #include <math.h> / ...

  2. logminer日志挖掘

    参考自:https://blog.csdn.net/yes_is_ok/article/details/79296614 原文转自:http://blog.itpub.net/26736162/vie ...

  3. Delphi 中的 IfThen 函数

    问题来源: http://www.cnblogs.com/del/archive/2008/11/14/1120015.html#1370413 StrUtils 单元和 Math 单元 分别有一个 ...

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

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

  5. 解决Jenkins安装的时区问题

    正常情况下,jenkins是Java执行在Java容器,比如tomcat容器之下,只要改了tomcat的时区就行.我这里是为了方便后续的代码可用性测试,用的是Ubuntu中apt在线安装,也只是安装了 ...

  6. 组合拳出击-Self型XSS变废为宝

    前言 作者:米斯特安全攻防实验室-Vulkey_Chen 博客:gh0st.cn 这是一个鸡肋性质的研究,也许有些标题党,请见谅- 本文启发于一些讨论,和自己脑子里冒出来的想法. 组合拳搭配 Self ...

  7. 继承user表需要配置

    AUTH_USER_MODEL = 'users.User'   (应用名.模型类名)

  8. 消除浏览器对input的自动填充

    在做登录相关的页面时,常遇到这样的现象,浏览器input的自动填充行为. 原因 设置 input 的 type 属性为 password 后,当页面进行过提交,并且允许浏览器记住密码后,那么再次加载该 ...

  9. 使用PageHepler分页

    首先需要引入依赖 <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>p ...

  10. js自定义水印

    前言:今天在github上看到了一个定义水印的项目,因为获取的星星还蛮多,就多看了几眼,发现该项目简单有趣,心想以后可能会用的到,并且我下载到本地并亲自测试运行了一波.其实该项目最吸引我的是它定义js ...