[PHP] 算法-字符串的全排列的PHP实现
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串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实现的更多相关文章
- 【算法与数据结构】Java实现字符串的全排列及组合
注:本文记录了代码编写及调试过程,想直接浏览正确答案的请移步文章结尾. 一.字符串的全排列问题 1. 下面是最初的代码(答案有错误-重复输出) import java.util.Scanner; pu ...
- python3:实现字符串的全排列(无重复字符)
最近在学一些基础的算法,发现我的数学功底太差劲了,特别是大学的这一部分,概率论.线性代数.高数等等,这些大学学的我是忘得一干二净(我当时学的时候也不见得真的懂),导致现在学习算法,非常的吃力.唉!不说 ...
- 28. 字符串的全排列之第2篇[string permutation with repeating chars]
[本文链接] http://www.cnblogs.com/hellogiser/p/string-permutation-with-repeating-chars.html [题目] 输入一个字符串 ...
- 剑指Offer26 字符串的全排列
/************************************************************************* > File Name: 26_String ...
- KMP替代算法——字符串Hash
很久以前写的... 今天来谈谈一种用来替代KMP算法的奇葩算法--字符串Hash 例题:给你两个字符串p和s,求出p在s中出现的次数.(字符串长度小于等于1000000) 字符串的Hash 根据字面意 ...
- python3:实现字符串的全排列(有重复字符)
抛出问题 求任意一个字符串的全排列组合,例如a='123',输出 123,132,213,231,312,321. 解决方案 #字符串任意两个位置字符交换 def str_replace(str, x ...
- python3实现字符串的全排列的方法(无重复字符)
https://www.jb51.net/article/143357.htm 抛出问题 求任意一个字符串的全排列组合,例如a='123',输出 123,132,213,231,312,321.(暂时 ...
- LeetCode初级算法--字符串01:反转字符串
LeetCode初级算法--字符串01:反转字符串 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.ne ...
- LeetCode初级算法--字符串02:字符串中的第一个唯一字符
LeetCode初级算法--字符串02:字符串中的第一个唯一字符 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog. ...
随机推荐
- 关于Selenium WebDriver的geckodriver
下载Selenium的最新版本地址:http://selenium-release.storage.googleapis.com/index.html 友情提示:如果一直下载不了,可能是浏览器与下载工 ...
- keepalived给LVS带来了什么
LVS+Keepalived 1>Keepalived简介 Keepalived是Linux下一个轻量级别的高可用解决方案,高可用(High Avalilability,HA),其实两种不同的 ...
- table设置上下左右边距不一样-html
新手上路,刚刚自学html,仅作为记录学习历程用,有需要的可以参考. 1.边距相同时 <table align="center" cellpadding="15re ...
- Struts2新漏洞S2-046在线实验环境全球首发
Strust2 又出现漏洞啦?搞事情啊? 据说S2-046漏洞和S2-045漏洞非常相似,都是由报错信息带入了buildErrorMessage方法造成的, 只是这次存在两个触发点哦!危害嘛,你说嘞? ...
- Javascript高级编程学习笔记(62)—— 事件(6)焦点事件
焦点事件 焦点事件会在页面元素获得或者失去焦点时触发,利用焦点事件和 document.hasFocus() 方法配合使用 以及 document.activeElement 属性配合可以知晓用户在页 ...
- Web前端JQuery面试题(三)
Web前端JQuery面试题(三) 1.怎么阻止冒泡过程? stopPropagation(); // 阻止冒泡过程 2.ready()方法和onload()方法的区别? onload()方法要等页面 ...
- 2个简单实例让你快速理解try-catch的用法
相信在实际项目中,你可能经常会看到类似下面的代码 try { // 尝试执行代码块 } catch(err) { // 捕获错误的代码块 } finally { // 结果如何都会执行的代码块 } 简 ...
- 从字节码看java中 this 的隐式传参
从字节码看java中 this 隐式传参具体体现(和python中的self如出一辙,但是比python中藏得更深),也发现了 static 与 非 static 方法的区别所在! static与非s ...
- Oracle开窗函数笔记及应用场景
介绍Oracle的开窗函数之前先介绍一下分析函数,因为开窗函数也属于分析函数 分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是:对于每个组返回多行,而聚合函数对于每个组只返回一行. 上面是 ...
- C语言那年踩过的坑--局部变量,静态变量,全局变量在内存中存放的位置
先看几个概念: 1.bss是英文block started by symbol的简称,通常是指用来存放程序中未初始化的全局变量的一块内存区域,在程序载入时由内核清0.bss段属于静态内存分配.它的初始 ...