字串的排列 組合

2021-07-11 00:00:51 字數 1441 閱讀 5149

遞迴方法

1、全排列

//面試題28:字串的排列

/*從集合依次選出每乙個元素,作為排列的第乙個元素,然後對剩餘的元素進行全排列,如此遞迴處理;

n個數的全排列,一共有n!種情況. (n個位置,第乙個位置有n種,當第乙個位置固定下來之後,第二個位置有n-1種情況...)

全排列的過程:

選擇第乙個字元

獲得第乙個字元固定下來之後的所有的全排列

選擇第二個字元

獲得第一+ 二個字元固定下來之後的所有的全排列

從這個過程可見,這是乙個遞迴的過程。

*/#include

using namespace std;

void swap(char* c1, char* c2)

void permutation(char* str, char* begin)

else

}}void permutation(char* str)

permutation(str, str);

}

測試

char

str = "abc";

permutation(str);

2、組合

//面試題擴充套件:字串的組合

//遞迴

#include

#include

using namespace std;

void combination(char* str, int i, string& result);

void combination(char* str)

int length = strlen(str);

string result;

for (int i = 1; i <= length; i++)

}void combination(char* str, int number, string& result)

else

if (*str == '\0')

else

}

測試

char

str = "abc";

combination(str);

3、基於點陣圖的字串的組合

//基於位圖

/*假設原有元素n個,最終的組合結果有2^n - 1. 可以使用2^n - 1個位,1表示取該元素,0表示不取。 所以a表示001,取ab是011。

001,010,011,100,101,110,111。對應輸出組合結果為:a,b,ab,c,ac,bc,abc。

*/void combination_bit(char* str)

else

}cout << result << endl;}}

}

字串排列組合

題目描述 輸入乙個字串,按字典序列印出該字串中字元的所有排列。例如輸入字串abc,則列印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。題目分析 考慮把這個複雜的問題分解成為小的問題。整個字串的排列,可以看成兩個部分 首先,求所有可能出現在第乙個位置的字元 然...

字串排列組合

1 字串的組合 子串行 題目 輸入乙個字串,輸出該字串中字元的所有組合。例子 輸入 abc,它的組合有 a b c ab ac bc abc 分析 我們可以將字串中的每個字元看成二叉樹的乙個節點,根節點為空,每個節點都會有兩種選擇 要 和 不要 兩種選擇 那麼我們就可以利用遞迴實現。public c...

字串的排列組合

題目描述 輸入乙個字串,列印出該字串中字元的所有排列。基本思路 從字串中選出乙個字元作為排列的第乙個字元,然後對剩餘的字元進行全排列,如此遞迴,從而得到所有字元的全排列。以對字元 abc 進行全排列為例,可以按下述步驟執行 將a固定在第一位,求後面bc的排列 將b固定在第一位,求後面ac的排列 將c...