演算法學習 全排列

2021-10-03 07:15:03 字數 1672 閱讀 7163

//全排列

#include

#include

#include

#include

#include

#include

using

namespace std;

//統計元素在string**現的次數

intcal_num

(char ch, string str)

return cnt;

}//遞迴實現

//len為長度

vector

getallpai_1

(string str,

int len)

vector result_last =

getallpai_1

(str, len -1)

;//上一層的結果集

for(string s : result_last)

}return res;

}//迭代實現

vector

getallpai_2

(string str)

} result_old = result_new;

}return result_old;

}//交換,回溯(簡潔)

//v_res為儲存結果的容器

void

getallpai_3

(vector

&v_res, string str,

int index)

for(

int i = index; i < str.

length()

; i++)}

//字首法(用於求全排列中按字典序排序的第k個排列,資料量大的時候顯得效率較高)

//prefix為當前的字首,用count來計數

int count_2 =0;

void

getallpai_4

(string str, string prefix,

int k)

}//每次都從頭開始掃瞄,只要該字元可用,就附加到字首後面

for(

int i =

0; i < str.

length()

; i++)}

}int

main()

count =1;

cout <<

"交換回溯法結果:--------------------------------"

<< endl;

vector v_res;

getallpai_3

(v_res, str,0)

;sort

(v_res.

begin()

, v_res.

end())

;for

(string s : v_res)

int k;

cin >> k;

cout <<

"全排列中按字典序排序的第"

<< k <<

"個排列:"

;sort

(str.

begin()

, str.

end())

;getallpai_4

(str,

"", k)

;return0;

}

演算法學習之字串全排列

第一種方法字串全排列,思想上和我們高中學的排列一樣,比如123,開始的時候第乙個位置有三種選擇,第乙個選完之後第二個位置就只剩下兩種選擇,第三個位置,就剩一種,所以一共有n 種排列,所以我們可以用遞迴的思想去做,遞迴中做交換 include include define max 50 void sw...

演算法 全排列

從n個不同元素中任取m m n 個元素,按照一定的順序排列起來,叫做從n個不同元素中取出m個元素的乙個排列。當m n時所有的排列情況叫全排列。用演算法分別實現全排列,其中n個元素儲存在乙個長度為n的陣列中。實現全排列之前,先看一下對進行全排列的一種方法 從圖中可以看出,我們首先從n個元素中取出乙個元...

全排列演算法

1.遞迴全排列 分別將每個位置交換到最前面位,之後全排列剩下的位。遞迴全排列 1 2 3 4 5 1,for迴圈將每個位置的資料交換到第一位 swap 1,1 5 2,按相同的方式全排列剩餘的位 2.字典序全排列演算法 對給定的字符集中的字元規定了乙個先後關係,在此基礎上規定兩個全排列的先後是從左到...