分類: 程式員面試題 2011-10-07 15:05 5人閱讀 評論(0) 收藏 舉報
題目:輸入一個字元串,輸出該字元串中字元的所有組合。舉個例子,如果輸入abc,它的組合有a、b、c、ab、ac、bc、abc。
用遞歸的思路來求字元串的組合:
假設我們想在長度為n的字元串中求m個字元的組合。我們先從頭掃描字元串的第一個字元。針對第一個字元,我們有兩種選擇:一是把這個字元放到組合中去,接下來我們需要在剩下的n-1個字元中選取m-1個字元;而是不把這個字元放到組合中去,接下來我們需要在剩下的n-1個字元中選擇m個字元。這兩種選擇都很容易用遞歸實作。
參考代碼:
view plain
- #include<iostream>
- #include<vector>
- using namespace std;
- void Combination(char *str, unsigned int number, vector<char> &result);
- void Combination(char *str)
- {
- if(!str)
- return;
- unsigned int length = strlen(str);
- vector<char> result;
- for(int i=1; i<=length; i++)
- {//依次求 i 個字元組成的序列
- Combination(str, i, result);
- }
- }
- void Combination(char *str, unsigned int number, vector<char> &result)
- {
- if(number == 0)
- {// i 個字元的某個序列已選取完,輸出之
- vector<char>::iterator index = result.begin();
- for(; index < result.end(); index++)
- {
- cout<<*index;
- }
- cout<<endl;
- return;
- }
- if(*str == '\0')
- return;
- //把目前字元放入序列中,在剩下的串中選取number-1個字元的序列
- result.push_back(*str);
- Combination(str+1, number-1, result);
- result.pop_back();
- //不把目前字元放入序列中,在剩下的串中選取number個字元的序列
- Combination(str+1, number, result);
- }
- int main()
- {
- char *str = "abcd";
- Combination(str);
- system("pause");
- return 0;
- }