字典排序演算法

2021-08-17 21:57:59 字數 1507 閱讀 2752

*字典排序演算法

*乙個全排列可看做乙個字串,字串可有字首、字尾。

*生成給定全排列的下乙個排列.所謂乙個的下乙個就是這乙個與下乙個之間沒有其他的。這就要求這乙個與下乙個有盡可能長的共同字首,也即變化限制在盡可能短的字尾上。

*[例]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 如何對一組數找到他的全排列 解答 採用字典序排列演算法。用字典序法得到全排列的思路大概是這樣的 我們需要有乙個初始的排列狀態,對於這個排列,用字典序法...