全排列的要求:
輸入:字串"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字元進行交換。第二步 把第乙個字元後面的所有字元仍然看成兩部分,即後面的第乙個字元及除此之...