遞迴方法
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...