//全排列
#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.字典序全排列演算法 對給定的字符集中的字元規定了乙個先後關係,在此基礎上規定兩個全排列的先後是從左到...