全排列 不含重複元素

2021-10-09 23:57:34 字數 1696 閱讀 9263

總結定義:從n個不同元素中任取m(m≤n)個元素,按照一定的順序排列起來,叫做從n個不同元素中取出m個元素的乙個排列。當m=n時所有的排列情況叫全排列。

示例:對陣列或者字串進行全排列時,一般要求得出所有的排列結果。排列結果中的每個元素來自於原始陣列,數量和內容與原始陣列相同,只是元素的位置發生了改變。

比如對abc字串進行全排列。則最後其全排列的結果為:abc,acb,bac,bca,cab,cba。

注:當對n各不相同的元素進行全排列時,其最終的排列結果有n!種。

#include

using namespace std;

int cnt=0;

voidf(

int p,string str,

int n)

//c++中相關sort函式的使用

//bool compare(int i,int j)

//sort(str.begin(),str.end(),compare); 進行排列的起始位置,str.end()進行排列的結束位置,compare自定義的用於規定相關的排列方式,此處compare可以省略,當其省略後預設為公升序排列

sort

(str.

begin()

+p,str.

end())

;for

(int i=p;iintmain()

總體思路:抽取可用元素追加到新的陣列中,相應的排列結果也在新的陣列中。

**如下(示例):

注:被抽取過的元素不能重複使用。

#include

using namespace std;

int cnt =0;

//記錄全排列含有多少種方式

int vis[10]

=;//記錄每個元素是否被訪問過

voidf(

char str,

int n,

char b,

int p)

for(

int i=

0;i}int

main()

c++ stl中提供了std::next_permutation與std::prev_permutation可以獲取數字或者是字元的全排列,其中std::next_permutation提供公升序,std::prev_permutation提供降序。

說明:next_permutation,重複排列範圍內的元素(第一,最後乙個)返回按照字典序排列的下乙個值較大的排列。

返回值:如果有乙個更高的排列,它重複排列元素,並返回true;如果這是不可能的(因為它已經在最大可能的排列),它按公升序排列所有元素,並返回false。

注:在用此方法進行全排列前,需要是相應的字串變得有序。

#include

using namespace std;

intmain()

while

(next_permutation

(str.

begin()

,str.

end())

);cout

}

在上述的全排列演算法中,只適合於對不重複的元素進行全排列。

無論是交換法還是抽取法,在對元素的位置進行交換或追加中,其最後均需要回到初始狀態,這樣才能保證後面的交換或者追加正確。

重複元素的全排列問題

簡介 本文主要介紹基於分治方式 遞迴 和列舉方式 迴圈 來構建指定字串的全排列方法,兩種方法都可以解決重複元素的全排列 歡迎 如有錯誤敬請指正 1.基於分治方式 遞迴實現 1 乙個元素的全排列只有一種 2 a0,a1,a2 的全排列等於下面三個全排列的並集 a0開頭,拼接上 a1,a2 的所有全排列...

有重複元素的全排列

題目描述 集合s中有n個元素,其中的元素可能重複,設計乙個演算法,計算出s的不同排列字元全部由小寫字母組成,輸出按照字典序輸出 n 9輸入 第一行乙個整數n 第二行乙個字串包含n個字母輸出 所有的全排列 最後一行輸出個數 樣例輸入 4 aacc 樣例輸出 aacc acac acca caac ca...

生成重複元素的全排列

1.具體分析 我們在很多時候都需要使用到全排列,但是有的時候由於元素是重複的,所以先生成全排列然後再進行判斷的話那麼消耗的時間比較多,有可能在資料規模比較大的時候就計算不出來,這個時候我們可以採用另外一種的方法來提前判斷遞迴下去的全排列是否是重複的 2.思路如下 將所有的元素放到乙個陣列之中,使用乙...