全排列列印

2021-12-29 22:57:25 字數 1110 閱讀 2814

全排列列印

全排列的要求:

輸入:字串"abc"。

輸出:如下圖示,

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

比如對於字串」abc」,

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

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

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

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

全排列的遞迴實現:                                    

[cpp] 

static int g_scnt= 0; 

//permutation的過載版本. 

voidpermutation(char* pstr, char* pbegin) 

else 

//end for 

}//end else 

} //全排列處理函式 

voidpermutation(char* pstr) 

else 

}   

int main() 

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

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

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

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

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

[cpp] 

void permutation(char* str) 

cout << endl; 

}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 的全排列 ...

全排列列印

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

列印全排列

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