字典序排列演算法解析

2021-09-26 05:18:33 字數 1268 閱讀 3501

字典序全排列演算法分析:

給定一組字串s,首先將字串轉化為字元陣列c,將字元陣列c中的元素從小到大排序,得到的即為字典序全排列的第乙個排列。

因為每個字元的大小是按照他的ascii碼對應的數字比較大小的,所以這裡以一串數字為例。例如:15432.其實可以將字典序全排列看作數字進製的過程,例如:從後往前數,倒數第四位的數達到了最大值(即從後往前找,後面的數總是小於或等於前面的數,滿足從尾部向前遞增過程 ),則倒數第五位需要進製(即第五位不滿足從尾部向前遞增過程), 所以從第後4位找最小的大於1的數,即2。將2 和1 完成調換,倒數第五位完成進製, 然後將後四位轉為最小的數(即從小到大排列)位1345。所以15432的下乙個排列為21345.總結步驟如下:

1、尋找下乙個排列的步驟:

1.從尾部向前找第乙個變小的位置i-1,此時p(i-1) p(i-1),p(m+1)以上**是將全排列依次列印,也可以按需要改為接收全排列,**如下:

public static void prim(char data,char q) 

i++;

}while(nextpermutate(data));

}

因為要傳入乙個二維陣列q用來接收全排列列表,所以要對其大小定義。

int len = s.length();  //s為傳入的字串

int l = factorial(len); //總排列數

char q = new char [l][len];

prim(s.tochararray(),q);//將字串s轉為字元陣列,獲取其字典序全排列結果

public static int factorial(int n)

return sun;

}

4.尋找謎底

public static void main(string args) 

string rv = new string[n];

for(int i = 0; i < n; i++)

for(int i = 0; i < n; i++) }

public static void midi(string s)

public static int indexa(charq, char d)

} return -1; }

public static boolean charcompare(char a, char b)

} return true;

}

c 排列和字典序全排列解析

我們知道c 裡自帶的有全排列,對於在演算法或者acm之類的競賽可謂是非常的好用的乙個函式。那麼在學習全排列和組合演算法之前我們先來看一下自帶的函式如何使用。首先,對於全排列c 給出了兩個函式,next permutation 和 prev permutation 顧名思義,next permutai...

全排列演算法的字典序排列

之前在中描述了全排列演算法的遞迴解法,這裡再說一種演算法 字典序排列。字典序排列就是按照字典a z,1 9的順序給出字串的順序全排列,例如abc的全排列就是從abc一直排到cba。那麼給定乙個字串,怎麼找出恰好大於該字串的下乙個排列呢?我們考慮如下的步驟 1 假設字串為p1p2 pn,我們從後往前尋...

字典序輸出全排列演算法

請編寫程式輸出前nnn個正整數的全排列 n 10n 10n 10 並通過9個測試用例 即nnn從1到9 觀察nnn逐步增大時程式的執行時間。輸入給出正整數nnn 10 10 10 輸出1到nnn的全排列。每種排列佔一行,數字間無空格。排列的輸出順序為字典序,即序列a1,a2,ana 1 a 2 a ...