PHP實(shí)現(xiàn)字符串的全排列詳解
輸入一個(gè)字符串,按字典序打印出該字符串中字符的所有排列。
例如,輸入字符串a(chǎn)bc,則打印出由字符a,b,c所能排列出來的所有字符串a(chǎn)bc,acb,bac,bca,cab和cba。
思路:
1.利用遞歸形成遞歸樹,達(dá)到深度優(yōu)先,固定首字母的效果
2.得復(fù)位以后才能再次深度優(yōu)先
3.回溯法思想
4.一張圖和一個(gè)運(yùn)行過程,只能慢慢體會了
<?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();//調(diào)用入口,從索引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"}

相關(guān)文章
php使用PDO下exec()函數(shù)查詢執(zhí)行后受影響行數(shù)的方法
這篇文章主要介紹了php使用PDO下exec()函數(shù)查詢執(zhí)行后受影響行數(shù)的方法,結(jié)合實(shí)例形式分析了php在使用pdo進(jìn)行增刪改操作時(shí)exec()函數(shù)查詢操作執(zhí)行后受影響行數(shù)的相關(guān)實(shí)現(xiàn)技巧與注意事項(xiàng),需要的朋友可以參考下2017-03-03
ExtJS與PHP、MySQL實(shí)現(xiàn)存儲的方法
ExtJS與PHP、MySQL實(shí)現(xiàn)存儲的方法,需要的朋友可以參考下,里面有詳細(xì)的步驟。2010-04-04
php代碼架構(gòu)的八點(diǎn)注意事項(xiàng)
這篇文章主要介紹了php代碼架構(gòu)的八點(diǎn)注意事項(xiàng),較為全面的分析總結(jié)了基于面向?qū)ο蟪绦蛟O(shè)計(jì)的代碼架構(gòu)設(shè)計(jì)問題相關(guān)注意事項(xiàng),需要的朋友可以參考下2016-01-01
PHP基于簡單遞歸函數(shù)求一個(gè)數(shù)階乘的方法示例
這篇文章主要介紹了PHP基于簡單遞歸函數(shù)求一個(gè)數(shù)階乘的方法,結(jié)合實(shí)例形式分析了php遞歸函數(shù)的定義與數(shù)學(xué)運(yùn)算簡單操作技巧,需要的朋友可以參考下2017-04-04
php實(shí)現(xiàn)的美國50個(gè)州選擇列表實(shí)例
這篇文章主要介紹了php實(shí)現(xiàn)的美國50個(gè)州選擇列表實(shí)例,可實(shí)現(xiàn)讓當(dāng)前州為選中狀態(tài)的功能,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-04-04
PHP+swoole+linux實(shí)現(xiàn)系統(tǒng)監(jiān)控和性能優(yōu)化操作示例
這篇文章主要介紹了PHP+swoole+linux實(shí)現(xiàn)系統(tǒng)監(jiān)控和性能優(yōu)化操作,結(jié)合實(shí)例形式分析了php啟動(dòng)swoole及Linux性能監(jiān)控相關(guān)操作技巧,需要的朋友可以參考下2019-04-04
利用PHP實(shí)現(xiàn)智能文件類型檢測的實(shí)現(xiàn)代碼
通常我們想嚴(yán)格限制文件類型的時(shí)候,可以簡單地用$_FILES['myFile']['type'] 取得文件的 MIME類型然后來檢測它是否是合法的類型。2011-08-08

