*字典排序演算法
*乙個全排列可看做乙個字串,字串可有字首、字尾。
*生成給定全排列的下乙個排列.所謂乙個的下乙個就是這乙個與下乙個之間沒有其他的。這就要求這乙個與下乙個有盡可能長的共同字首,也即變化限制在盡可能短的字尾上。
*[例]839647521是1--9的排列。1—9的排列最前面的是123456789,最後面的987654321,從右向左掃瞄若都是增的,就到了987654321,也就沒有下乙個了。否則找出第一次出現下降的位置。
* 【例】 一般而言,設p是[1,n]的乙個全排列。
* p=p1p2…pn=p1p2…pj-1pjpj+1…pk-1pkpk+1…pn
* find: j=max
* 1, 對換pj,pk,
* 2, 將pj+1…pk-1pjpk+1…pn翻轉
* p』= p1p2…pj-1pkpn…pk+1pjpk-1…pj+1即p的下乙個
*【例】 如何得到346987521的下乙個
* 1,從尾部往前找第乙個p(i-1) < p(i)的位置
* 3 4 6 <- 9 <- 8 <- 7 <- 5 <- 2 <- 1
* 最終找到6是第乙個變小的數字,記錄下6的位置i-1
* 2,從i位置往後找到最後乙個大於6的數
* 3 4 6 -> 9 -> 8 -> 7 5 2 1
* 最終找到7的位置,記錄位置為m
* 3,交換位置i-1和m的值
* 3 4 7 9 8 6 5 2 1
* 4,倒序i位置後的所有資料
* 3 4 7 1 2 5 6 8 9
* 則347125689為346987521的下乙個排列
例題:輸入乙個字串,按字典序列印出該字串中字元的所有排列。例如輸入字串abc,則列印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。
輸入乙個字串,長度不超過9(可能有字元重複),字元只包括大小寫字母。
**如下:
class solution
setmapdictionary;
string strtemp = str;
sort(strtemp.begin(), strtemp.end());
vecresult.push_back(strtemp);
mapdictionary.insert(strtemp);
string strend = strtemp;
for (int i = 0; i < strend.length() / 2; i++)
while (strend != strtemp)}}
}if (bisfind)}}
return vecresult;
}};
字典排序演算法(通俗易懂)
我們先看乙個例子。示例 1 2 3的全排列如下 1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1 我們這裡是通過字典序法找出來的。那麼什麼是字典序法呢?從上面的全排列也可以看出來了,從左往右依次增大,對這就是字典序法。可是如何用演算法來實現字典序法全排列呢?你主要看紅色字型部分...
2個和字典排序相關函式 字典排序演算法實現
字典排序思路見下圖 lexicographic permute 字典排序演算法 includeusing namespace std 判斷最後乙個排列,是否存在 2個元素是公升序的,並記錄最右公升序左邊那個數的位置 比如 1 5 2 6 3 公升序 1,5 2 6 記錄 2所在位置 loc 2 in...
演算法學習日記 字典法排序
演算法學習日記 字典法排序 問題 給出給定序列的全排列 例如 序列為1 2 3 輸出為 123 132 213 231 312 321 問題分析 1 如何對一組數找到他的全排列 解答 採用字典序排列演算法。用字典序法得到全排列的思路大概是這樣的 我們需要有乙個初始的排列狀態,對於這個排列,用字典序法...