全排列列印

2021-06-25 09:12:49 字數 1435 閱讀 6684

全排列的要求:

輸入:字串"abc"。

輸出:如下圖示,

思路1——全排列的遞迴實現核心思想:

比如對於字串」abc」,

第一步:求所有可能出現在第乙個位置的字元即:a,b,c。

使用方法:把第乙個字元和後面的b、c字元進行交換。

第二步:把第乙個字元後面的所有字元仍然看成兩部分,即後面的第乙個字元及除此之外的其他字元。然後完成後面的第乙個字元與其他字元的交換。比如:第2個位置的b與第3個位置c的交換。

第三步:依次遞迴,直到末尾的』\0』為止。

全排列的遞迴實現:

[cpp]view plain

copy

static

intg_scnt= 0;  

//permutation的過載版本.

voidpermutation(char

* pstr, 

char

* pbegin)  

else

//end for

}//end else

}  //全排列處理函式

voidpermutation(char

* pstr)  

else

}  intmain()    

思路2——全排列的stl實現:

有時候遞迴的效率使得我們不得不考慮除此之外的其他實現,很多把遞迴演算法轉換到非遞迴形式的演算法是比較難的,這個時候我們不要忘記了標準模板庫stl已經實現的那些演算法,這讓我們非常輕鬆。

stl有乙個函式next_permutation(),它的作用是如果對於乙個序列,存在按照字典排序後這個排列的下乙個排列,那麼就返回true且產生這個排列,否則返回false。

注意,為了產生全排列,這個序列要是有序的,也就是說要呼叫一次sort。

實現很簡單,我們看一下**:

[cpp]view plain

copy

void

permutation(

char

* str)  

cout <

}while

(next_permutation(str,str+length));  

}  int

main()    

思路3:全排列的字典樹實現

列印全排列

今天碰到乙個打全排列的問題,仔細研究了一下,用遞迴的思想搞出來了,現在把大概思想貼在下面了 假設要列印的是a,b c d e 很明顯應該採用遞迴,遞迴就得有子問題 列印a,b c d e 的問題可以分解成以下幾個子問題 列印a,列印 b c d e 的全排列 列印b,列印 a c d e 的全排列 ...

列印全排列

第一次嘗試 define crt secure no warnings include include 在被交換的元素前面序列中,如果出現了這個元素,那麼就不必交換了 intjudge int arr,int i,int k return1 int stringrank int arr,int k,...

全排列列印

全排列列印 全排列的要求 輸入 字串 abc 輸出 如下圖示,思路1 全排列的遞迴實現核心思想 比如對於字串 abc 第一步 求所有可能出現在第乙個位置的字元即 a,b,c。使用方法 把第乙個字元和後面的b c字元進行交換。第二步 把第乙個字元後面的所有字元仍然看成兩部分,即後面的第乙個字元及除此之...