输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串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. mysql--user表

    mysql数据库 用例:mysql  mysql> show tables; +---------------------------+ | Tables_in_mysql | +------- ...

  2. DOSBOX的安装和使用(window10 64位)

    1.安装DOSBOX DOXBOX和MASM的下载和安装 2.使用DOSBOX 1.打开只有一个窗口的dosbox 2.修改dosbox的分辨率 1.打开DOSBox 0.74 Options.bat ...

  3. 团队作业第六周--alpha阶段项目复审

    组名 优点 缺点 排名 天冷记得穿秋裤队 支持文件离线下载,没有限速 部分功能未实现 1 中午吃啥队 点餐系统需求高,系统功能完善 界面可以再完善 2 小谷围驻广东某工业719电竞大队 项目贴近大学生 ...

  4. SSAS 后端数据库访问模块中存在错误。 为绑定指定的大小太小,导致一个或多个列值被截断。

    在处理AS的过程中报错如上,经排查发现原因为数据库 “工号” 字段长度过长导致. 因为我的字段内容基本是人名加工号:张三/1001 不曾想有用户录入非正常数据 :张三/100/1001 这样导致我截取 ...

  5. Dubbo 源码分析 - 集群容错之 LoadBalance

    1.简介 LoadBalance 中文意思为负载均衡,它的职责是将网络请求,或者其他形式的负载"均摊"到不同的机器上.避免集群中部分服务器压力过大,而另一些服务器比较空闲的情况.通 ...

  6. Javascript高级编程学习笔记(70)—— 事件(14)内存和性能

    由于事件处理程序是现代的web程序交互能力的提供者 所以在日常实践中,我们免不了要向页面中添加大量的事件处理程序(不管是用于用户交互还是用于统计用户数据) 在创建GUI(图形用户界面)的语言(如C#) ...

  7. HBase——HMaster启动之一(HMaster的构建)

    首先,让我们来到HMaster的main方法.我们今天的流程就从这里开始. 我们需要注意,下图所示的tool的类型就是HMasterCommandLine. 接下来,让我们来到HMasterComma ...

  8. 百度翻译爬虫-Web版(自动生成sign)

    # 面向对象 # 百度翻译 -- 网页版(自动获取token,sign) import requests import js2py import json import re class WebFan ...

  9. maven的标准pom.xml详解

    maven是构建和管理理项目的利器,pom.xml 是其核心.一个标准的pom.xml该怎么写?其中的标签又有什么意义?话不多说,请看代码: <?xml version="1.0&qu ...

  10. Spring面试底层原理的那些问题,你是不是真的懂Spring?

    1.什么是 Spring 框架?Spring 框架有哪些主要模块?Spring 框架是一个为 Java 应用程序的开发提供了综合.广泛的基础性支持的 Java 平台.Spring帮助开发者解决了开发中 ...