程式設計之法學習筆記 1 3字串的全排列

2021-08-19 15:02:46 字數 1202 閱讀 9763

題目描述:

輸入乙個字串,列印出該字串中字元的所有排列。例如,輸入字串"abc",則輸出由字元'a'、'b'、'c'所能排列出來的所有字串"abc"、「acb」、"bac"、"bca"、"cab"、"cba"。

遞迴法:

字串"a"情況下(n=1),所需要操作為直接輸出。

字串"ab"情況下(n=2),可以將'a'作為首位,對"b"進行排列;也可以將'b'作為首位,對"a"進行排列。

字串"abc"情況下(n=3),可以將'a'作為首位,對"bc"進行排列;也可以將'b'作為首位,對"ac"進行排列;還可以將'c'作為首位,對"ab"進行排列。

可以將上述步驟抽象為:

1)將字串中第from位與第from+i位交換。

2)對第form+1位到結尾進行全排序。

3)將字串中第from位與第from+i位交換,將字串還原以便下次交換。

該演算法時間複雜度為o(n!),空間複雜度為o(1)。

void arrange(char * str, int from, int to)

}}

字典序排列:

字典序排序如同他的名字一樣,即把排序的順序按照字典從低到高的順序排序。對字串axb而言,他的下乙個字串對應為ayb`。為了實現下乙個字串緊靠在現字串後,應保證a盡可能長,y盡可能小,且b`按照從小到大的順序排序。

原因如下(把字串抽象為乙個整數更容易理解):

對於乙個整數而言,整數的增幅和其修改位為同一數量級。如果要使下乙個對應整數盡可能小,那麼應該修改其盡可能低位,從而使得增幅在低數量級下。模擬字串axb,如果x的位置越靠後,其意味著抽象整數的修改位越低,其增幅也就越小。而x的位置越靠後,則a的長度也就越長。

具體操作如下:

1)對於某一字串,為了保證a的長度盡可能長,那麼a字串的邊界應該是整個字串的最右公升序(只有出現了公升序,才意味著x位置可以修改變大,而最右保證了修改位最低)。所以首先應該找到整個字串的最右公升序。

2)找到b`中最小的數值y與x交換(交換最小數保證增幅最小)。

3)將b`字串翻轉(由於此時b`字串全部為降序,所以通過翻轉可以將其變為最小字串,即全部為公升序)。

具體**實現如下:

bool dict_arrange(char * str)

《程式設計之法》1 1 字串旋轉

題目 給定乙個字串,左旋轉m個字元,輸出旋轉後的字串。例如 abcdef 左旋轉3個字元後成為 defabc 解決辦法 三步反轉 將 abcdef 看成兩部分 x abc y def 先對x反轉,再對y反轉,然後整體反轉。void reversestring char s,int bg,int ed...

程式設計之法 有趣的字串全排列

輸入乙個字串,列印出該字串中所有字元的全排列。如 輸入字串 abc 所能排列出來的所有字串為 abc acb bac bca cab cba 解法一 遞迴實現 可以按照下述步驟執行 將a固定在第一位,求後面bc的排列,得到 abc acb 將b固定在第一位,求後面bc的排列,得到 bac bca 將...

《程式設計之法》 字串的包含

給定一長字串a和一短字串b。請問,如何最快地判斷出短字串b中的所有字元是否都在長字串a中。設乙個整數hash,對於a中的每一位,通過 運算在二進位制hash對應的位上置位。然後對於b中的每一位,通過 運算看是否hash中該位上是否有置位,以此來判斷是否有包含該字元。bool stringcontai...